没有花括号时,为什么字符串插值在Ruby中起作用?


90

在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中成功地尝试了这一点。

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

Answers:


103

根据Flanagan和Matsumoto撰写的Ruby编程语言

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

所以以下所有工作:

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

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

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

4
顺便问一下,顺便说一句。很高兴回到过去,找到我忘记的语言的各个角落。
tsherif 2012年

2
尽管您的答案没有给出原因或原因,但我发现很难确定原因。即使是Matz经常评论的旧留言板也无济于事。但是,您的答案表明这是功能,而不只是just幸。
Charles Caldwell 2012年

1
不过,我不确定您的期望是什么。您的意思是设计决定吗?我的猜测是这是对类似Perl的语法的尝试,因为我认为Ruby最初被认为是Perl ++的一种,然后才问世。
tsherif 2012年

2
我是一个完全菜鸟,只是让我的IDE抱怨我这样做。但是我很难说服自己这是好的风格。它毫无意义地不一致并且有一个缺点-例如,如果我有一个实例变量@distance,其值为100,并且想要使用类似“#@ distancem”的表达式来生成一个类似“ 100m”的字符串,我将得到一个空白字符串因为没有实例变量'distancem'。因此,这听起来简直就是糟糕的风格。
terriblememory

3
@terriblememory哦,这绝对是不好的风格。这就是为什么我开始指出问题的正确方法的原因。但是,我发现它根本不是语言的功能,这很奇怪,并且想知道为什么它起作用。再说一次,用连词开始句子也是不好的风格。但是您仍然会看到人们在这里和那里使用它。=)
查尔斯·考德威尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.