我最近使用Ruby进行编码,来自Python,其中单引号和双引号对代码的工作方式没有任何影响。
我转向Ruby看看它是如何工作的,并调查Ruby和Python之间的相似之处。
我曾经使用过单引号字符串并注意到了这一点:
hello = 'hello'
x = '#{hello} world!'
puts x
它返回'#{hello} world!'
而不是'hello world!'
。
注意到这一点后,我尝试了双引号,问题得到解决。现在我不确定为什么会这样。
单引号和双引号会改变这个还是因为我的编辑器(Sublime text 3)?如果它在以前的版本中工作方式不同,我也使用Ruby 2.0版。
答案 0 :(得分:7)
在Ruby中,双引号被内插,这意味着#{}
中的代码被评估为Ruby。单引号被视为文字(意味着不评估代码)。
var = "hello"
"#{var} world" #=> "hello world"
'#{var} world' #=> "#{var} world"
对于一些特殊的魔术,Ruby还提供了另一种创建字符串的方法:
%Q() # behaves like double quotes
%q() # behaves like single quotes
例如:
%Q(#{var} world) #=> "hello world"
%q(#{var} world) #=> "#{var} world"
答案 1 :(得分:2)
如果将Ruby字符串括在单引号中,则不能使用插值。这就是Ruby的工作方式。
答案 2 :(得分:2)
单引号字符串不处理转义序列\
,并且它们不进行字符串插值。
为了更好地理解,请查看String concatenation vs. interpolation
要回答您的问题,当您想要进行字符串插值时,必须使用""
:
name = 'world'
puts "Hello #{name}" # => "Hello world"
使用转义序列:
puts 'Hello\nworld' # => "Hello\nworld"
puts "Hello\nworld" # => "Hello
world"
答案 3 :(得分:2)
您应该阅读官方Ruby文档的Literals
部分。
它非常简洁,所以你需要仔细阅读。但它解释了双引号和单引号字符串之间的区别,以及它们如何分别等同于%Q/.../
和%q/.../
。
答案 4 :(得分:1)
Ruby支持单引号字符串,用于许多用途,如下所示:
>> 'foo'
=> "foo"
>> 'foo' + 'bar'
=> "foobar"
在上面的例子中,这两种类型的字符串是相同的。我们可以用双引号代替单引号,我们将获得与上例相同的输出。
当你遇到问题时,在单引号字符串中使用插值是因为Ruby不插入单引号字符串。我想举一个例子来加深理解:
>> '#{foo} bar'
=> "\#{foo} bar"
在这里,您可以看到使用双引号字符串返回值,这需要使用反斜杠来转义特殊字符,例如#。
单引号字符串通常很有用,因为它们是真正的字面值。
答案 5 :(得分:0)
在字符串插值概念中,使用单引号或双引号之间的本质区别在于双引号允许转义序列,而单引号则不允许。
我们举一个例子:
name = "Mike"
puts "Hello #{name} \n How are you?"
上面带有字符串插值的ruby代码将插入名为name
的变量,该变量写在括号内,其原始值为Mike
。它还会打印字符串你好吗?因为我们已经在那里放置了一个转义序列,所以在一个单独的行中。
输出:
Hello Mike
How are you?
如果对单引号执行相同操作,它会将整个字符串视为文本,并且它将按原样打印,包括转义序列。
name = Mike'
puts 'Hello #{name} \n How are you'?
输出:
Hello #{name} \n How are you?