web-dev-qa-db-ja.com

二重引用符と単一引用符

私はRubyが初めてであり、""''を使用すべき特定の時間があるかどうかを理解しようとしています。

入力しやすいので、私はほとんどの場合一重引用符を使用していますが、そうすべきかどうかはわかりません。

例えばget 'user/new' vs get "user/new"

156
imjp

" "を使用すると、次のように文字列補間を実行できます。

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

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

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

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

a = 2
puts "#{a}"

それ以外の場合は、単純な引用符を使用します。

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

そして、もしあなたが本当にRoRに慣れていないなら、言語の基本を学ぶためにまともなRuby本を手に入れることをお勧めします。これは、あなたが何をしているかを理解するのに役立ちます(そしてRailsが魔法だと考えないようにします)。個人的には The Well grounded Rubyist をお勧めします。

38

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

最初に、文字列のリテラル形式で、singleまたはdoublequotesは、Ruby St​​ringクラスのインスタンスである文字列オブジェクトとして評価されます。

したがって、'stackoverflow'"stackoverflow"は両方とも、Stringクラスのインスタンスを評価しますが、まったく違いはありません

違い

文字列の2つのリテラル形式(単一または二重引用符)の本質的な違い二重引用符はエスケープシーケンスを許可しますが、単一引用符は許可しません!

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

適切な例は次のとおりです。

"\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..

ベストプラクティス

ほとんどのRuby Lintersが示唆しているように文字列には一重引用符リテラルを使用しますおよびシーケンスの補間/エスケープの場合は二重のものに移動。

29
aloucas

単一引用符で囲まれた文字列は、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
6
Imran

印刷の答え「\ n」と同様に、次の違いもあります

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

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

3
Bryan Liu