我有一个代码块,看起来像这样:
returning({}) do |hash|
attributes.each { |key, value|
hash[key.underscore] = value
}
end
重写此代码以不使用返回魔法修复了Ruby 1.9.3中此方法的错误。这真的解决了一些问题,还是我只是错过了一些明显的东西?
谢谢。
我个人从未听说过returning
。但是你的代码片段可以用更标准的方法重写。
attributes.each_with_object({}) do |(key, value), memo|
memo[key.underscore] = value
end
方法returning
从来不是Ruby中的标准方法;在Rails的早期版本中,它是在Rails的ActiveSupport中提供的。它是k组合器的一个实现,通常被称为Kestrel。Ruby核心库现在提供了一个等效的方法Object#tap
。只需将代码片段中的returning
替换为tap
,它就会像您期望的那样工作。
然而,对于你想要做的,这是完全没有必要的。对于更简单的表达式,使用map
和Hash::[]
:
Hash[ attributes.map { |k, v| [k.underscore, v] } ]