为什么没有大括号的字符串插值在 Ruby 中也能工作?

在 Ruby 中使用字符串插值的正确方法如下:

name = "Ned Stark"
puts "Hello there, #{name}" #=> "Hello there, Ned Stark"

我打算一直这样使用它。

但是,我注意到了 Ruby 的字符串插值中的一些 奇怪特性。我注意到 Ruby 中的字符串插值在实例变量方面没有大括号。例如:

@name = "Ned Stark"
puts "Hello there, #@name" #=> "Hello there, Ned Stark"

尝试非实例变量的同样方法是不起作用的。

name = "Ned Stark"
puts "Hello, there, #name" #=> "Hello there, #name"

我在1.9.2和1.8.7中都成功地尝试过这种方法。

为什么会这样? 翻译在这里做什么?

37772 次浏览

According to The Ruby Programming Language by Flanagan and Matsumoto:

When the expression to be interpolated into the string literal is simply a reference to a global, instance or class variable, then the curly braces may be omitted.

So the following should all work:

@var = "Hi"
puts "#@var there!"  #=> "Hi there!"


@@var = "Hi"
puts "#@@var there!" #=> "Hi there!"


$var = "Hi"
puts "#$var there!"  #=> "Hi there!"