奇怪的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"