二重引用符と一重引用符


171

Rubyは本当に初めてで、""vs を使用する必要がある特定の時間があるかどうかを理解しようとしてい''ます。

タイプする方が簡単なため、ほとんどの場合、単一引用符を使用していますが、使用するかどうかはわかりません。

get 'user/new'get "user/new"


12
これはRoRの質問であり、Rubyの質問だけではないことを確信していますか?
イグナシオバスケスエイブラムス

文字列の補間が不要な場合の選択に関連するスタイルガイドはありますか?
William Entriken

回答:


202

" " 文字列補間を行うことができます。例:

world_type = 'Mars'
"Hello #{world_type}"

1
つまり、基本的には、常に二重引用符を使用します。
ねこなり

8
いいえ-二重引用符は、単に文字列の補間を可能にします。文字列の補間が不要な場合は、二重引用符を使用しないでください。
Panh 2018

4
補間が必要な場合にのみ二重引用符を使用する理由はありません。パフォーマンスに大きな影響はなく、何を使用する必要があるかを考えさせるだけです。二重引用符で囲まれた文字列を使用するだけです。
Matheus

137

補間を除いて、別の違いは、「エスケープシーケンス」が単一引用符で機能しないことです

puts 'a\nb' # just print a\nb 
puts "a\nb" # print a, then b at newline 

42
単一引用符自体をエスケープする場合を除き'don\'t'ます。
スパーホーク2013年

3
これは、この質問に対する非常に役立つ回答です。エスケープする必要のある引用符を除いて、単一引用符が単一引用符の間の文字通りすべてを印刷するためであることを私は決して認識しませんでした。ありがとうございました。
Jay Godse 2013

6
バックスラッシュも試しputs '\\'てみてください単一のスラッシュのみを印刷します。ここを参照してくださいstackoverflow.com/questions/25499046/...
のHardik

うん、単一引用符でエスケープできるのは2つのケースだけです
Alexis

@Alexisはわかりません、おそらくパフォーマンスに少し違いがあります
lfx_cool

40

あなたの質問に答える""には、文字列補間を行いたいときに使用する必要があります:

a = 2
puts "#{a}"

それ以外の場合は、単純な引用符を使用してください。

また、パフォーマンスの点で違いがあるかどうか疑問に思っている場合は、StackOverflowでこれについて優れた質問があります。

そして、あなたがRoRに本当に慣れていない場合は、適切なRubyの本を読んで言語の基本を学ぶことをお勧めします。それはあなたが何をしているかを理解するのに役立ちます(そしてRailsが魔法であると考えるのを防ぎます)。私は個人的にThe Well Grounded Rubyistをお勧めします。


34

Rubyの単一''引用符と二重引用符に""は、文字列に対して何が評価されるかという点で違いがあります。

最初に、文字列のリテラル形式では、引用符または二重引用符の間にあるものはすべて、Ruby Stringクラスのインスタンスである文字列オブジェクトとして評価されることを明確にしたいと思います。

したがって、'stackoverflow'"stackoverflow"の両方がStringクラスのインスタンスを評価するまったく違いで

違い

文字列の2つのリテラル形式(一重引用符または二重引用符)の本質的な違いは、二重引用符ではエスケープシーケンスが許可されるのに対し、単一引用符では許可されないことです。

一重引用符で作成された文字列リテラルは、文字列の補間をサポートせず、シーケンスをエスケープしません。

きちんとした例は次のとおりです。

"\n" # will be interpreted as a new line

一方

'\n' # will display the actual escape sequence to the user

一重引用符による補間はまったく機能しません。

'#{Time.now}'
=> "\#{Time.now}" # which is not what you want..

ベストプラクティス

ルビーリンターのほとんどが示唆したようあなたの文字列を単一引用符リテラルを使用し、補間/エスケープシーケンスの場合は二重のもののために行きます。


1
したがって、a = '\ n'およびb = "#{a}"がある場合、bは改行またはエスケープシーケンスとして解釈されますか?
NathanTempelman 2016

4
a = '\ n' aを割り当てた瞬間、aをbに補間することで「\\ n」と解釈され、新しい行は得られません。bは "\\ n"と評価されます(エスケープシーケンスを取得する新しい行はありません)。a = '\ n' => "\\ n" where as = "\ n" => "\ n"
aloucas

6

一重引用符で囲まれた文字列は、ASCIIエスケープコード(\ n、\ tなど)を処理せず、二重引用符で囲まれた文字列は文字列の補間を行いません。

エスケープコードの例:

2.4.0 :004 >   puts 'Hello \n World'
Hello \n World

2.4.0 :005 > puts "Hello \n World"
Hello
World

補間の例:

2.4.0 :008 >   age=27
 => 27

2.4.0 :009 > puts 'Age: #{age}'
Age: #{age}

2.4.0 :009 > puts "Age: #{age}"
Age: 27

4

印刷における「\ n」の回答と同様に、以下は違いの別のケースです

puts "\1"  -> get special character
puts '\1'  -> get \1

*は二重引用符でエスケープ文字に変換されたように見えますが、単一引用符では変換されませんでした。ところで、正規表現で使用すると、出力に影響します。例:str.gsub(/ regular expression /、 '\ 1、\ 2')


2

単一引用符を使用するもう1つの理由は、正規表現パターンを文字列として渡す場合です。

この正規表現パターンは、単一引用符内で渡されるため機能します。

"123 ABC".match('\d')
=> #<MatchData "1">

この正規表現パターンは、二重引用符で囲まれているため失敗します(機能させるには、二重エスケープする必要があります)。

"123 ABC".match("\d")
=> nil

-8

この特定のケースでは、どのように書いても違いはありません。それらは同等です。また、Rubyのガイドやチュートリアルをさらに読むこともできます。


4
二重引用符で文字列を解釈できるため、これらは同等ではありません。
Jason Noble

7
非常に賢い観察をする前に、「この特定の場合」の部分を読みましたか?
Geo

9
はい、しかし彼の質問は一重引用符と二重引用符のどちらを使用するかでし
Jason Noble
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.