一重引用符で囲まれた文字列のバックスラッシュと二重引用符で囲まれた文字列
質問
二重引用符と一重引用符で囲まれた文字列の先頭にバックスラッシュ + スペースを追加すると、異なる結果が得られます。
"\ text"
'\ text'
二重引用符で囲まれた文字列の出力にはスペースのみが表示されます。
一重引用符で囲まれた文字列の出力には、バックスラッシュ + スペースが表示されます。
そこで何が起こっているのでしょうか?これだからですか '\ '
は二重引用符の文字列では特殊文字として解釈されますが、一重引用符の文字列では文字はそのまま保持されますか?
文字列をこれに変更すると、同じ出力が表示されます。つまり、単一のスラッシュの後にスペースが続き、その後にテキストが表示されます。
"\\ text"
'\\ text'
どちらの場合も、バックスラッシュはエスケープされます。この状況でなぜ同じように機能するのか混乱しています。
Ruby で単一引用符で囲まれた文字列と二重引用符で囲まれた文字列がバックスラッシュを処理する方法の根本的な違いを説明するのに役立つ規則はありますか?
解決
<!> quot; Ruby Programming / Stringsを参照してください <!> quot;違いの非常に簡潔で包括的な概要をご覧ください。
参照から:
puts "Betty's pie shop"
puts 'Betty\'s pie shop'
<!> quot; Betty's <!> quot;単一引用符と同じ文字であるアポストロフィが2行目に含まれています。2行目には、アポストロフィをエスケープするためにバックスラッシュを使用する必要があります。バックスラッシュとそれに続く一重引用符は、エスケープシーケンスと呼ばれます。
他のヒント
二重引用符で囲まれた文字列は、以下に示すように、エスケープシーケンスの全範囲をサポートしています。
-
\a
ベル/アラート(0x07) -
\b
バックスペース(0x08) -
\e
エスケープ(0x1b) -
\f
Formford(0x0c) -
\n
改行(0x0a) -
\r
Return(0x0d) -
\s
スペース(0x20) -
\t
タブ(0x09) -
\v
垂直タブ(0x0b)
単一引用符で囲まれた文字列の場合、2つの連続したバックスラッシュは単一のバックスラッシュに置き換えられ、単一の引用符が続くバックスラッシュは単一の引用符になります。
'escape using "\\"' -> escape using "\"
'That\'s right' -> That's right
Rubyは、二重引用符で囲まれた文字列のエスケープシーケンスのみを解釈します。単一引用符で囲まれた文字列では、\\
(バックスラッシュバックスラッシュ)と\'
(バックスラッシュクォート)のみが特殊文字として使用されます。二重引用符で囲まれた文字列は、さらに解釈が必要な場合にのみ使用してください。それ以外の場合、一重引用符はパフォーマンスを向上させます。
変数の名前を含めて言及したとき、Rubyはそれを行いません。変数名だけがより多くの文字列リテラルとして扱われます。変数(または任意の式)の値を含めるには、次のように式を入力します。
"#{variable}"
これは二重引用符で囲まれた文字列でのみ機能することに注意してください。単一引用符で囲まれた変数に変数を追加するには、これを行う必要があります。
'The value of X is: '+X
本格的なフォーマットが必要な場合は、Rubyバージョンのsprintfおよびprintfを調べてください。これらはC関数のラッパーであり、非常に強力ですが、使用するのが少し面倒です。
これは完全な回答ではなく (単純な質問にはすでに回答されているため)、補足情報です。
逃げなければならない場合は、二重引用符を使用しないでください。そして、「シングル対二重引用符」トラップに落ちないでください。Rubyは、文字列リテラルの任意の区切り文字に対して優れたサポートを持っています。
私はそのアドバイスを受け入れ、過去を振り返ることはありませんでした。
これは、「\」が で特殊文字として解釈されます 二重引用符の文字列ですが、 一重引用符で囲まれた文字列 そのまま保存されますか?
はい。一重引用符で囲まれた文字列はリテラルとして扱われます。二重引用符で囲まれた文字列は補間されます。これは他のRubyライクな言語でも同じであり、1.9でも変更されていません。
<%= f.label :nom_entreprise, "Nom de l'entreprise" %>