2013-11-28 81 views
3

我最近在Ruby中编写代码,并且来自Python,其中单引号和双引号对代码的工作方式没有影响,据我所知。红宝石单双引号

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

我是用单引号字符串一次注意到了这一点:

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

它返回'#{hello} world!'而非'hello world!'

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

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

回答

6

在Ruby中,插入了双引号,这意味着#{}中的代码被评估为Ruby。单引号被视为文字(意味着代码未被评估)。

var = "hello" 
"#{var} world" #=> "hello world" 
'#{var} world' #=> "#{var} world" 

对于一些额外的,特殊的魔力,红宝石还提供了另一种方式来创建字符串:

%Q() # behaves like double quotes 
%q() # behaves like single quotes 

例如:

%Q(#{var} world) #=> "hello world" 
%q(#{var} world) #=> "#{var} world" 
+0

嗯,我知道了,谢谢。 – anakin

+0

@sethvargo:请不要拉票。至少你应该花时间回答迟到的问题。我认为一两天是公平的。 – Borodin

+0

@Borodin它似乎是用户是相对较新的Stackoverflow并可能不理解系统。我没有拉票的人。 – sethvargo

1

如果您以单个qoutes包装Ruby字符串,则不能使用插值。这就是Ruby的工作原理。

2

单引号字符串不处理转义序列\,他们不做字符串插值。 为了更好地理解,看看String concatenation vs. interpolation

要回答你的问题,你必须使用""当你想要做字符串插值:

name = 'world' 
puts "Hello #{name}" # => "Hello world" 

使用转义序列:

puts 'Hello\nworld'  # => "Hello\nworld" 
puts "Hello\nworld"  # => "Hello 
           world" 
+0

*单引号字符串不处理转义序列* \ - **,除了**两种特殊情况:撇号'\''和反斜杠本身'\\'。希望这很明显,为什么。 –

2

您应该阅读官方Ruby文档的Literals部分。

它非常简洁,所以你需要仔细阅读。但它解释了双引号字符串和单引号字符串之间的区别,以及它们分别相当于%Q/.../%q/.../

1

Ruby支持单引号内的字符串,对于许多用途等如下:

>> 'foo' 
=> "foo" 
>> 'foo' + 'bar' 
=> "foobar" 

在上面的例子中,这两种类型串是相同的。我们可以使用双引号代替单引号,并且我们将得到与上例相同的输出。

由于Ruby不插入单引号字符串,因此在单引号字符串中使用插值时会面临问题。我以一个例子进行更多的了解:

>> '#{foo} bar' 
=> "\#{foo} bar" 

在这里,您可以用双引号字符串,这需要反斜杠转义特殊字符,如#看到返回值。

单引号字符串通常很有用,因为它们确实是字面意思。

0

在字符串插值概念中,使用单引号或双引号的本质区别在于双引号允许转义序列,而单引号则不允许。

让我们举个例子:

name = "Mike" 
puts "Hello #{name} \n How are you?" 

的与字符串内插上述红宝石的代码将被称为内插其内写入括号与作为Mike其原始值name变量。它也会打印字符串你好吗?在一个单独的行中,因为我们已经在那里放置了转义序列。

输出:

Hello Mike 
    How are you? 

如果你做同样的单引号,它将把整个字符串作为一个文本,它会打印,因为它包括转义序列为好。

name = Mike' 
puts 'Hello #{name} \n How are you'? 

输出:

Hello #{name} \n How are you?