2016-08-29 7 views
1

では動作しませんtest.rbというサンプルコードです:は、%Q表記でエスケープすることはここではIRB

s = %Q_abc\_def\_ghi_ 
puts s 

s = %q_abc\_def\_ghi_ 
puts s 

予想通りそれは正常に動作します:

➜ Desktop ruby test.rb 
abc_def_ghi 
abc_def_ghi 

しかし、私はそれを実行したときIRBには、何もs = %q_abc\_def\_ghi_後に起こらなかっ:

➜ Desktop irb 
irb(main):001:0> s = %Q_abc\_def\_ghi_ 
=> "abc_def_ghi" 
irb(main):002:0> puts s 
abc_def_ghi 
=> nil 
irb(main):003:0> 
irb(main):004:0* s = %q_abc\_def\_ghi_ 
irb(main):005:1> puts s 
irb(main):006:1> 
irb(main):007:1* 
irb(main):008:1* 

それは動作しませんなぜ?そして、どうすれば '_'(または他の区切り文字)を%q表記でエスケープできますか?

私のRubyのバージョンは次のとおりです。これはRubyのファイルとIRBで異なる表示されますが、小文字パーセント文字列をエスケープしない理由

ruby -v 
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin15] 
+1

「%q」はエスケープシーケンスを認識しないと思います。しかし、なぜエスケープを必要としない別の文字 '%q {abc_def_ghi_} 'を選択しないのかわかりません –

+0

私が'%q_abc \ _def \ _ghi_'を選択したのは学習目的のためです。私は '%q {abc_def_ghi_} 'が自然なことを理解しています。しかし、私はちょうどWHYを知りたい。 –

+0

プレーンテキストの入力または出力をプレーンテキストとして試して貼り付けます。スクリーンショットは、一部の人々が使用するのが難しいです。 – tadman

答えて

2

IRBには独自のRubyレクサー/パーサーがあり、入力されたコードの状態を追跡し、文字列の途中にあるかどうかなどの異なるプロンプトを表示するようにすることができます。メソッドまたはクラスを定義します。コードはRubyに渡され、「適切に」評価されます。

実際にシングルクォートを使用していないシングルクォートのスタイル文字列をエスケープする方法に関するバグがあるようです。

Ruby自体がエスケープ処理を処理するので、通常、このバグは実際には大きな影響はないと思われますが、この例ではdefという文字列を使用しています。これは2番目の_の直後ですIRB also looks for

この組み合わせは、IRBを実際に起こっていることとは何かが理解されている奇妙な状態に置くように見えます。これはあなたが見ている奇妙な行動です。

IRBコードのチェックアウトされたバージョンで少し遊んでこれをサポートしているようです。 snippet I think is to blame looks like this

も使用されている実際の文字を探すために whenライン変更
elsif ch == '\\' and @ltype == "'" #' 
    case ch = getc 
    when "\\", "\n", "'" 
    else 
    ungetc 
    end 

when "\\", "\n", "'", quoted 

quotedが関数に渡されたパラメータである)はそれを修正するを表示され、あなたを例はすべてこの修正されたバージョンで正常に動作します。私はそれが十分な修正であるかどうかわからない、私はコードを知らない - これはちょうど簡単なハックです。

これについてはバグをオープンする価値があります。

+0

詳細な説明ありがとうございます。私は問題を開いた:https://bugs.ruby-lang.org/issues/12712 –

0

私はよく分かりません。 Difference between '%{}', '%Q{}', '%q{}' in ruby string delimiters

はエスケープをサポートしていないため、異なるデリミタとエスケープ文字を使用しようとすると、未定義の動作が考えられます。

これはおそらくあなたが探していた答えではありませんが、少し助けてくださいと思います。

+0

Mmm、 '%q'がエスケープをサポートしていない場合、rubyコマンドとirbの両方で' s =%q_abc \ _def \ _ghi_'に構文エラーが発生するはずです。非常に奇妙な。 –

関連する問題