奇怪的Ruby语法?

我正在ruby-lang.org上做Ruby 20分钟的教程,我发现这个代码搞乱了irb:

irb(main):015:0> def h(name) irb(main):016:1> puts "Hello #{name}!" irb(main):017:1> end 

根据解释, #{name}部分只是将变量添加到字符串中? 我认为这是一种奇怪而冗长的编写方式所以我只是想我会尝试"Hello" + name ,它的工作方式完全一样..

我用Google搜索试图找到#{}的含义,我找不到任何关于它的事情,所以我想我会问社区..有什么区别? 有吗?

提前致谢!

有时候使用+会更容易,但在这种情况下,你会留下感叹号。 考虑:

 puts "Hello #{name}!" 

 puts "Hello " + name + "!" 

我发现第一个更易读,特别是在字符串中多次使用时。

还要考虑在第二个版本中“Hello”之后省略空间是多么容易:

 puts "Hello" + name + "!" 

很容易写,但可能不是你的意思。

最后,当您插入的内容不是字符串时,它会产生更大的差异:

 puts "The Winner was #{name} with a score of #{score}!" 

顺便说一句,搜索“字符串插值”可能会使查找事物变得更容易,而不仅仅是搜索语法。

 "Hello #{name}!" "Hello " + name + "!" 

字符串插值几乎总是容易阅读,特别是如果有多个值要插入。

如果插值的值很详细,则可能会变得困难:

 "Attendees: #{names.collect(&:first_name).join(', ')}" 

在这种情况下,您可能想要连接,或者只使用临时变量。

重要的是要注意,它不仅仅是可读性。 使用字符串插值将做正确的事情,例如在#{}之间的任何内容上调用to_s

 1.9.3p194 :001 > "as" + 23 TypeError: can't convert Fixnum into String from (irb):1:in `+' from (irb):1 from /Users/paul/.rvm/rubies/ruby-1.9.3-p194/bin/irb:16:in `
'

相反

 1.9.3p194 :002 > "as #{23}" => "as 23" 

最大的区别是易于阅读,符合习惯用法和速度。

使用"Hello " + name + "!" 你(好吧,Ruby解释器)总共创建了3个额外的字符串,而不是"Hello #{name}!" 它只创建一个额外的字符串。

请记住,使用字符串插值( "#{}" )会自动调用#to_s ,这可能是也可能不需要。

有关更多信息,请参阅此SO问题 。

#{}用于字符串插值 ,使您可以轻松,清晰地将数据放入字符串中。 Ruby评估花括号内的内容,然后调用其to_s方法,每个Ruby对象都从Objectinheritance。

这允许您甚至在字符串中进行计算,例如

 "5 + 7 = #{5 + 7}" => "5 + 7 = 12"