文字列でエスケープ文字を使用する方法

私はRuby Koansを通して働いていて、 "エスケープ句とシングルクォート文字列"の例で混乱しています。

1つの例では、実際にエスケープ文字をこのように使用することはできませんが、直後には次の例が与えられます。

def test_single_quotes_sometimes_interpret_escape_characters
  string = '\\\''
  assert_equal 2, string.size # <-- my answer is correct according to the program
  assert_equal "\\'", string  # <-- my answer is correct according to the program
end

これは私を2つの面で混乱させました。

  1. エスケープ文字でシングルクォートを使用することがあります。
  2. assert_equal "\\\" "の場合、文字列サイズは 2 ですかなぜですか? (私は個人的に答えは "\ '" だと思っていました。これはサイズに関してより意味があります)。
2

2 答え

string を2つに分けて、物事を明確にすることができます:

string = '\\' + '\''

各部分は長さ1の文字列です。 ' \ という単一の文字で、' \ '' 'という単一の文字です。それらをまとめると、2つの文字列 \ 'が得られます。

一重引用符で囲まれた文字列リテラル内には特殊な2つの文字があります:バックスラッシュと単一引用符自体です。一重引用符文字はもちろん文字列を区切るために使用されるので、一重引用符を一重引用符で囲む文字列にするには特別なものが必要です。特別なものはバックスラッシュですので、 '\ 'は、単一引用符文字を含む文字列を表す単一引用符文字列リテラルです。同様に、引用符で囲まれた文字列リテラルにバックスラッシュを付ける必要がある場合は、別のバックスラッシュでエスケープするので、 '\\' は長さ1でバックスラッシュは1つです。

一重引用符文字は、二重引用符で囲まれた文字列リテラル内に特別な意味を持ちませんので、難なく "'と言うことができます。しかし、バックスラッシュは二重引用符で囲まれた文字列で特別な意味を持ちますので、二重引用符で囲まれた文字列に単一のバックスラッシュを付けるには "\\"

あなたの推測を "\" "で考えてみてください。一重引用符は二重引用符で囲まれた文字列内に特別な意味を持たず、エスケープする必要のないものをエスケープするだけであなたの何かしたがって、 c が二重引用符で囲まれた文字列内でエスケープする必要のない文字の場合、 \ c c になります。特に、 "\ '" "'" (つまり、二重引用符で囲まれた文字列内の一重引用符)に評価されます。

結果は次のとおりです。

  • '\\\' '== "\\'"
  • "\\\" "== '\\"'
  • "\ '" ==' \ ''
  • "\ '" == "'
  • '\\\' '。length == 2
  • "\\\" "。length == 2
  • "\ '"。長さ== 1
  • "'"。length == 1

Kassymが提供した Wikibooksリファレンスは、これらのことをカバーしています。

私は通常 %q {} (一重引用符に似ています)または%Q {} (二重引用符に似ています)。文字列に引用符を付ける必要があるときは、すべてのバックスラッシュが私の目を傷つけます。

それは優れた説明です。両方のあなたのリンクのおかげで。私はあなたにも同意します。%q {} /%Q {}オプションは読みやすいので引用符に最適です。
追加された 著者 helipacter,

This might be worth a read : http://en.wikibooks.org/wiki/Ruby_Programming/Strings

ruby-1.9.3-p0 :002 > a = '\\\''
 => "\\'" 
ruby-1.9.3-p0 :003 > a.size
 => 2 
ruby-1.9.3-p0 :004 > puts a
\'

一重引用符では、 \\ \ 'という2つのエスケープ文字しかありません。

0
追加された
2番目のアサートは正しいです。一重引用符を二重引用符で囲む必要はありません(ただし、バックスラッシュをエスケープする必要があります)。
追加された 著者 Mark Thomas,
もちろん、私の悪い。私が何を考えているのか分からない
追加された 著者 Kassym Dorsel,