5

なぜこのエラーが発生するのですか?

    Regexp.new("[#$]")
    # => SyntaxError: (irb):1: syntax error, unexpected $undefined
    # => Regexp.new("[#$]")
    #              ^
    # (irb):1: unterminated string meets end of file
    #     from ~/.rvm/rubies/ruby-1.9.3-p194/bin/irb:1:in `<main>'

これは、文字通り、単一の$またはのいずれかで構成される文字列のサブセットを記述する必要があります。#また、AFAIU Ruby の Regexp エンジンであり、通常はメタ文字ですが、文字クラス内でエスケープする必要はありません#$

エラー メッセージから推測すると、Ruby はダブル クォーテーションで囲まれ$ている場合に補間しようとしていますが、なぜでしょうか? #注文は重要です。$および文字には複数の#オーバーロードされた動作があるため、何がこれを引き起こしているのか途方に暮れています。

PS、参考までに:

    /[#$]/
    # => SyntaxError: (irb):1: syntax error, unexpected $undefined
    /[$#]/
    # => /[$#]/
    Regexp.new '[$#]'
    # => /[$#]/
    Regexp.new '[#$]'
    # => /[#$]/
    Regexp.new "[#$]"
    # => SyntaxError: (irb):1: syntax error, unexpected $undefined
4

1 に答える 1

7

問題は ではなく$##...重引用符で囲まれた文字列の変数展開に通常使用される . のように"#{x}"

ただし、を使用してグローバル変数を直接展開することもできます#$global。これにより、問題が説明されます。

$global = "hello"
"#$global"
=> "hello"

したがって、解決策は、またはのいずれ # $をエスケープすることです。これにより、文字列補間ステート マシンが構成要素を補間として解釈しようとする努力から解放されます。

puts "\#$global"
=> #$global
puts "#\$global"
=> #$global

編集

そして、それを本当に明確にするために:)問題は ではありませんが、入力時に名前がRegexp付けられたグローバル変数を展開しようとしています:$]"#$]"

puts "#$]"
SyntaxError: (irb):22: syntax error, unexpected $undefined

それを修正するには、何かをエスケープする必要があります:

puts "\#$]"
=> #$]
于 2012-05-23T18:01:10.957 に答える