【问题标题】:Why does string interpolation work in Ruby when there are no curly braces?当没有花括号时,为什么字符串插值在 Ruby 中起作用?
【发布时间】:2012-04-10 14:58:47
【问题描述】:

在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 中都成功地尝试过。

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

【问题讨论】:

    标签: ruby string-interpolation


    【解决方案1】:

    根据 Flanagan 和 Matsumoto 的 The Ruby Programming Language

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

    所以以下应该都可以工作:

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

    【讨论】:

    • 很酷的问题,顺便说一句。很高兴回去找到我忘记的语言的小角落。
    • 虽然您的回答没有包含原因或正在发生的事情,但我发现原因很难确定。即使是 Matz 经常评论的旧留言板也无济于事。但是,您的回答表明这是一项功能,而不仅仅是侥幸。
    • 我不确定您期望的原因是什么。你的意思是作为一个设计决策?我的猜测是,这是对 Perl-like 语法的尝试,因为我相信 Ruby 最初被认为是一种 Perl++,然后才出现。
    • 我是一个完全的菜鸟,只是让我的 IDE 抱怨我这样做。但我很难说服自己这是一种很好的风格。这是毫无意义的不一致并且有一个缺点 - 例如。如果我有一个值为 100 的实例变量 @distance,并且想要使用“#@distancem”之类的表达式创建一个类似于“100m”的字符串,我将得到一个空白字符串,因为没有实例变量“distancem”。所以这听起来完全是糟糕的风格。
    • @terriblememory 哦,这绝对是糟糕的风格。这就是为什么我通过指出正确的方法来开始我的问题。然而,我只是觉得奇怪的是它完全是该语言的一个特性,并想知道它为什么会起作用。再说一次,以连词开头的句子也是不好的风格。但是你仍然会看到人们在这里和那里使用它。 =)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 2014-12-05
    相关资源
    最近更新 更多