web-dev-qa-db-ja.com

一重引用符で囲まれた文字列と二重引用符で囲まれた文字列の円記号

二重引用符と一重引用符で囲まれた文字列の先頭に円記号とスペースを追加すると、異なる結果が得られます。

"\ text"
'\ text' 

二重引用符で囲まれた文字列の出力には、スペースしか表示されません。
一重引用符で囲まれた文字列の出力には、円記号+スペースが表示されます。

そこで何が起こっているのですか?これは'\ 'は、二重引用符で囲まれた文字列では特殊文字として解釈されますが、一重引用符で囲まれた文字列では、文字はそのまま保持されますか?

文字列をこれに変更すると、同じ出力が表示されます。つまり、単一のスラッシュ、スペース、テキストの順になります。

"\\ text"
'\\ text' 

どちらの場合も、円記号はエスケープされます。この状況でなぜ同じように機能するのか混乱しています。

一重引用符で囲まれた文字列と二重引用符で囲まれた文字列がRubyでバックスラッシュを処理する方法の根本的な違いを説明するのに役立つルールはありますか?

27
Tucker

違いの非常に簡潔で包括的な概要については、 " Ruby Programming/Strings "を参照してください。

参照から:

puts "Betty's pie shop"

puts 'Betty\'s pie shop'

「Betty's」には一重引用符と同じ文字であるアポストロフィが含まれているため、2行目では、バックスラッシュを使用してアポストロフィをエスケープし、Rubyがアポストロフィが文字列リテラルの終わりをマークする代わりに、文字列リテラル。バックスラッシュとそれに続く一重引用符は、エスケープシーケンスと呼ばれます。

7
zvoase

二重引用符で囲まれた文字列は、以下に示すように、エスケープシーケンスの全範囲をサポートします。

  • \aベル/アラート(0x07)
  • \bバックスペース(0x08)
  • \eエスケープ(0x1b)
  • \fフォームフォード(0x0c)
  • \n改行(0x0a)
  • \rリターン(0x0d)
  • \sスペース(0x20)
  • \tタブ(0x09)
  • \v垂直タブ(0x0b)

一重引用符で囲まれた文字列の場合、2つの連続する円記号は単一の円記号に置き換えられ、円記号の後に一重引用符が続くと一重引用符になります。

'escape using "\\"' -> escape using "\"
'That\'s right'     -> That's right
21
John Topley

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

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

"#{variable}"

これは二重引用符で囲まれた文字列でのみ機能することに注意してください。一重引用符で囲まれた変数に変数を追加するには、次のようにする必要があります。

'The value of X is: '+X

本格的なフォーマットが必要な場合は、Rubyのバージョンのsprintfとprintfを調べてください。これらはC関数のラッパーであり、非常に強力ですが、使用するのが少し面倒です。

10
Linuxios

これは完全な答えではなく(簡単な質問はすでに回答されているため)、補足情報です。

Ruby文字列の引用のどのスタイルが好きですか?

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

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

私はそのアドバイスを受けて、振り返ったことがありません!

4
Ian Terrell

これは、「\」が二重引用符で囲まれた文字列では特殊文字として解釈されますが、一重引用符で囲まれた文字列では文字がそのまま保持されるためですか?

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

3
bzlm

あなたは<%= f.label :nom_entreprise, "Nom de l'entreprise" %>を作ることができます

0
Adel Drömmaren