Ruby单引号和双引号

时间:2013-11-28 19:49:08

标签: ruby

我最近使用Ruby进行编码,来自Python,其中单引号和双引号对代码的工作方式没有任何影响。

我转向Ruby看看它是如何工作的,并调查Ruby和Python之间的相似之处。

我曾经使用过单引号字符串并注意到了这一点:

hello = 'hello'
x = '#{hello} world!'
puts x

它返回'#{hello} world!'而不是'hello world!'

注意到这一点后,我尝试了双引号,问题得到解决。现在我不确定为什么会这样。

单引号和双引号会改变这个还是因为我的编辑器(Sublime text 3)?如果它在以前的版本中工作方式不同,我也使用Ruby 2.0版。

6 个答案:

答案 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?