Ruby格式的字符串和插值字符串的行为是否相同?

时间:2010-04-28 12:56:18

标签: ruby-on-rails ruby

尽管实现略有不同,但以下两行代码的行为方式完全相同

values.map{ |k,v| __send__('%s=' % k.to_s, v) }
values.map{ |k,v| __send__("#{k.to_s}=", v) }

第二行是一个更常见的红宝石成语,所以我想知道为什么在Rails核心中使用其他方法时我会期望使用惯用的红宝石。

1 个答案:

答案 0 :(得分:2)

它们并不完全相同。例如,第一个示例将调用String#%,因此如果出于某种奇怪的原因重新定义了该方法,则可能会得到不同的结果。使用String#%的标准定义,计算的字符串将是相同的,因此两个表达式将具有相同的结果。

顺便说一句,在此示例中不需要to_s,并假设send尚未重新定义(因此等同于__send__):

values.map{ |k,v| send("#{k}=", v) }