29

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

"\ text"
'\ text' 

二重引用符で囲まれた文字列の出力には、スペースしかありません。
一重引用符で囲まれた文字列の出力に、バックスラッシュ + スペースが表示されます。

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

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

"\\ text"
'\\ text' 

どちらの場合も、バックスラッシュはエスケープされます。この状況でなぜ彼らが同じように機能するのか、私は混乱しています。

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

4

6 に答える 6

23

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

  • \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
于 2009-03-15T18:10:21.880 に答える
10

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

変数の名前を含めると述べたとき、Ruby は決してそれを行いません。変数名だけが文字列リテラルとして扱われます。変数 (または任意の式) の値を含めるには、次のように式を入れます。

"#{variable}"

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

'The value of X is: '+X

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

于 2011-11-26T15:21:01.097 に答える
8

相違点の非常に簡潔で包括的な概要については、 「 Ruby プログラミング/文字列」を参照してください。

参照から:

puts "Betty's pie shop"

puts 'Betty\'s pie shop'

"Betty's" には一重引用符と同じ文字であるアポストロフィが含まれているため、2 行目ではバックスラッシュを使用してアポストロフィをエスケープする必要があります。これにより、Ruby は、アポストロフィが末尾を示すのではなく、文字列リテラル内にあることを認識できます。文字列リテラル。バックスラッシュの後に一重引用符を付けたものをエスケープ シーケンスと呼びます。

于 2009-03-15T17:29:38.403 に答える
4

これは完全な回答ではなく (簡単な質問には既に回答済みであるため)、補足情報です。

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

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

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

私はそのアドバイスを受けて、決して振り返りませんでした!

于 2009-03-16T11:52:13.510 に答える
3

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

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

于 2009-03-15T18:00:17.503 に答える