奇怪的Ruby语法?

时间:2012-07-24 21:49:35

标签: ruby string hash

我正在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搜索试图找到#{}的含义,我找不到任何关于它的事情,所以我想我会问社区..有什么区别?有吗?

提前致谢!

5 个答案:

答案 0 :(得分:5)

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

puts "Hello #{name}!"

VS

puts "Hello " + name + "!"

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

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

puts "Hello" + name + "!"

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

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

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

顺便说一句,搜索“字符串插值”可能会比搜索语法更容易找到事物。

答案 1 :(得分:4)

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

String interpolation几乎总是很多更容易阅读,特别是如果有多个值要插入。

如果插值的值是详细的,可能变得困难:

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

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

答案 2 :(得分:2)

重要的是要注意,这不仅仅是可读性。使用字符串插值将做正确的事情,例如在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 `<main>'

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

答案 3 :(得分:2)

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

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

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

有关详细信息,请参阅this SO question

答案 4 :(得分:1)

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

这使您甚至可以在字符串中进行计算,例如

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