为什么在没有花括号的情况下,字符串插值在Ruby中工作?

Cha*_*ell 84 ruby string-interpolation

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

name = "Ned Stark"
puts "Hello there, #{name}" #=> "Hello there, Ned Stark"
Run Code Online (Sandbox Code Playgroud)

这就是我打算一直使用它的方式.

但是,我注意到Ruby的字符串插值有些奇怪.我注意到字符串插值在Ruby中没有关于实例变量的花括号.例如:

@name = "Ned Stark"
puts "Hello there, #@name" #=> "Hello there, Ned Stark"
Run Code Online (Sandbox Code Playgroud)

尝试与非实例变量相同的东西不起作用.

name = "Ned Stark"
puts "Hello, there, #name" #=> "Hello there, #name"
Run Code Online (Sandbox Code Playgroud)

我在1.9.2和1.8.7中都尝试过这一点.

为什么这样做?口译员在这做什么?

tsh*_*rif 98

根据Flanagan和Matsumoto 的Ruby编程语言:

当要插入到字符串文字中的表达式只是对全局,实例或类变量的引用时,可以省略花括号.

所以以下都应该有效:

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

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

$var = "Hi"
puts "#$var there!"  #=> "Hi there!"
Run Code Online (Sandbox Code Playgroud)

  • 很酷的问题,顺便说一句.很高兴回去找到我忘记的语言的小角落. (4认同)
  • 啊.第48页.好眼睛. (3认同)
  • @terriblememory哦,这绝对是糟糕的风格.这就是为什么我通过指出正确的方法来开始我的问题.但是,我发现奇怪的是它完全是语言的一个特征,并且想知道它为什么会起作用.然后,用连词开始一个句子也是不好的风格.但你仍然会看到人们在这里和那里使用它.=) (3认同)
  • 尽管您的回答没有包含原因或正在发生的事情,但我发现原因很难确定。即使是马茨经常评论的旧留言板也无济于事。但是,您的回答表明它是一个功能,而不仅仅是侥幸。 (2认同)
  • 我是一个完整的菜鸟,只是让我的IDE抱怨我这样做.但我很难说服自己这是一个很好的风格.这是毫无意义的不一致并且有一个缺点 - 例如,如果我有一个值为100的实例变量@distance并且想要使用像"#@ distancem"这样的表达式创建一个类似"100m"的字符串,我将只得到一个空字符串因为没有实例变量'distancem'.所以这听起来像是彻头彻尾的糟糕风格. (2认同)