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