尽管实现略有不同,但以下两行代码的行为方式完全相同
values.map{ |k,v| __send__('%s=' % k.to_s, v) }
values.map{ |k,v| __send__("#{k.to_s}=", v) }
第二行是一个更常见的红宝石成语,所以我想知道为什么在Rails核心中使用其他方法时我会期望使用惯用的红宝石。
答案 0 :(得分:2)
它们并不完全相同。例如,第一个示例将调用String#%
,因此如果出于某种奇怪的原因重新定义了该方法,则可能会得到不同的结果。使用String#%
的标准定义,计算的字符串将是相同的,因此两个表达式将具有相同的结果。
顺便说一句,在此示例中不需要to_s
,并假设send
尚未重新定义(因此等同于__send__
):
values.map{ |k,v| send("#{k}=", v) }