2

我正在 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它的工作方式完全相同..

我四处搜索试图找到一个意义#{},但我找不到任何谈论它的东西,所以我想我会问社区..有什么区别?有吗?

提前致谢!

4

5 回答 5

5

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

puts "Hello #{name}!"

对比

puts "Hello " + name + "!"

我发现第一个更具可读性,尤其是在字符串中多次使用时。

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

puts "Hello" + name + "!"

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

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

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

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

于 2012-07-24T21:52:30.007 回答
4
"Hello #{name}!"
"Hello " + name + "!"

字符串插值几乎总是容易阅读,特别是在需要插入多个值的情况下。

如果插入的值很冗长,则可能会变得很困难

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

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

于 2012-07-24T21:53:55.220 回答
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" 
于 2012-07-24T21:58:54.370 回答
2

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

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

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

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

于 2012-07-24T22:06:24.670 回答
1

#{} 用于字符串插值,它允许您轻松清晰地将数据放入字符串中。Ruby 计算花括号内的内容,然后调用它的to_s方法,每个 Ruby 对象都从 Object 继承。

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

"5 + 7 = #{5 + 7}"
=> "5 + 7 = 12"
于 2012-07-24T21:59:45.507 回答