2009-03-15 22 views
24

私はダブルとシングル引用符で囲まれた文字列の先頭にバックスラッシュ+スペースを追加した場合、私は別の結果を得る:単一引用符で囲まれた文字列内のバックスラッシュ対の二重引用符で囲まれた文字列

"\ text" 
'\ text' 

出力には、二重引用符で囲まれた文字列について私は空間だけを見る。
シングルクォート文字列の出力には、バックスラッシュ+スペースが表示されます。

何が起こっていますか?これは'\ 'が二重引用符文字列の中で特殊文字として解釈されるためですが、一重引用符で囲まれた文字列ではその文字はそのまま保持されますか?バックスラッシュはエスケープされ、両方のケースで

"\\ text" 
'\\ text' 

:私はこれまでの文字列を変更した場合は

は、私は同じ出力、スペースに続いて、すなわち、単一のスラッシュし、テキストを参照してください。私は、なぜこのような状況で同じように動作するのか混乱しています。

シングルクォート文字列とダブルクォート文字列がバックスラッシュをRubyで処理する方法の基本的な違いを説明するのに役立つルールがいくつかありますか?

+0

あなたの編集後、あなたの質問は本質的に「現在Ruby 1.9で最新のWikibooksですか?」となっています。これに合わせて質問のタイトルを編集してください。 – bzlm

答えて

6

Ruby Programming/Strings」にご連絡いただき、その違いを非常に簡潔かつ包括的に把握しています。

参照から:

puts "Betty's pie shop"

puts 'Betty\'s pie shop'

「ベティの」私たちが使用する必要がある2行目に、単一引用符と同じ文字でアポストロフィを、含まれているためアポストロフィをエスケープするバックスラッシュで、文字列リテラルの終わりをマークするのではなく、アポストロフィが文字列リテラルにあることをRubyが理解できるようにします。単一引用符の後のバックスラッシュは、エスケープシーケンスと呼ばれます。

+6

["良い答えを書くにはどうすればいいですか"](https://stackoverflow.com/help/how-to-answer):「外部リソースへのリンクが推奨されていますが、ターゲットサイトに到達できない場合や、永続的にオフラインになる場合に備えて、常に重要なリンクの最も関連性の高い部分を引用します。 –

3

「\」を二重引用符文字列 でなく、あるとして保存され 単一引用符で囲まれた文字列の文字に特殊文字として解釈 あるので?このですか

はい。一重引用符で囲まれた文字列はリテラルとして扱われます。二重引用符で囲まれた文字列が補間されます。これは他のRubyのような言語でも同じですが、1.9では変更されていません。以下に示すように

+0

二重引用符文字列(補間)を一重引用符に変換する方法はありますか? –

+0

もしそうでなかったら私は驚くだろう! – bzlm

18

ダブル引用符で囲まれた文字列は、エスケープシーケンスのフルレンジをサポートしています。

  • \aベル/警報(0x07の)
  • \bバックスペース(0x08の)
  • \eエスケープ(として0x1B)
  • \f Formford(0x0Cの)
  • \n改行文字(0x0Aの)
  • \rリターン(0x0Dが)
  • \sスペース(0x20の)
  • \tタブ(0x09の)単一引用符で囲まれた文字列の
  • \v垂直タブ(0x0Bの)

、二つの連続バックスラッシュが置き換えられます単一のバックスラッシュとバックスラッシュの後ろに単一引用符が続きます。

'escape using "\\"' -> escape using "\" 
'That\'s right'  -> That's right 
+0

二重または一重引用符で囲まれた文字列内に単一のバックスラッシュを使用することはありますか?私はまったく何もしないように見えるので、ちょうど混乱していますが、消えてしまいます。 – thesowismine

4

これは完全な答えではありません(簡単な質問には既に回答しているので)、補足的な情報です。

Which style of Ruby string quoting do you favour?

あなたが それらをエスケープする必要がある場合は、二重引用符を使用しないでください。また、「 とダブルクォート」のトラップには入らないでください。 Rubyは、文字列リテラルの任意 区切り文字の 優れたサポートがあります。

http://rors.org/2008/10/26/dont-escape-in-strings

私はそのアドバイスを取って、後ろを振り返ることがありません!

7

Rubyは、二重引用符で囲まれた文字列のエスケープシーケンスのみを解釈します。一重引用符で囲まれた文字列では、\\(バックスラッシュのバックスラッシュ)と\'(バックスラッシュのクォート)のみが特殊文字として扱われます。より多くの解釈が必要な場合にのみ、二重引用符文字列を使用する必要があります。それ以外の場合は、シングルクォートでパフォーマンスが向上します。

あなたが変数の名前を含めて言及したとき、Rubyはそれを決してしません。変数名だけが、より多くの文字列リテラルとして扱われます。変数の値(または任意の式)を含めるには、このように式を入れる:

"#{variable}" 

注二重引用符で囲まれた文字列でのみ動作という。単一引用符で囲まれた1に変数を追加するには、この実行する必要があります。

'The value of X is: '+X 

をあなたが深刻なフォーマットが必要な場合は、sprintfのとのprintfのRubyのバージョンを調べます。彼らはC関数の周りにかなりラッパーであり、非常に強力ですが、使用するにはちょっと面倒です。

+0

パフォーマンスの向上についての部分を信じてはいけません。ベンチマークでは表示されません。なぜなら、Rubyはファイルをロードするときに文字列を解析し、その違いがなくなるからです。いずれかの質問のどこかでSOのベンチマークを行い、そのアイデアを否定した結果が出ました。 *ブーストがある場合、それは小さく、アプリケーションの起動時にのみ発生します。 –

+0

@theTinMan:私にベンチマークがあると思いますか?私はそれを見たいと思います。理論的には、エスケープシーケンスを探す必要がないことからパフォーマンスが向上するはずですが、それは注目すべき大きな違いである最適化されたCのほんの少しです。 – Linuxios

+0

問題の[ベンチマーク](http://stackoverflow.com/a/13039446/128421)は、配列を定義するさまざまな方法に関するものでした。文字列の場合と同じ状況があり、スクリプトが読み込まれるときに相違点が削除され、一度メモリに実際の違いはないと思う。その答えのベンチマークに基づいてあなた自身のために見えるテストを書くのは簡単です。 –

関連する問題