我有一段看起来像这样的代码:
returning({}) do |hash|
attributes.each { |key, value|
hash[key.underscore] = value
}
end
重写这个不使用返回魔法修复此方法打破Ruby 1.9.3。这真的能解决问题吗,还是我错过了一些明显的东西?
感谢。
答案 0 :(得分:1)
我个人从未听说过returning
。但是你的代码片段可以用更标准的方法重写。
attributes.each_with_object({}) do |(key, value), memo|
memo[key.underscore] = value
end
答案 1 :(得分:0)
方法returning
从来就不是Ruby中的标准方法;它是在早期版本的Rails中的Rails'ActiveSupport中提供的。它是K-combinator的一个实现,通常被称为Kestrel。 Ruby核心库现在提供了一个等效的方法Object#tap
。只需在代码段中用tap
代替returning
,它就会按预期运作。
然而,对于你想要做的事情,它根本就没有必要。使用map
和Hash::[]
可以更简单地表达:
Hash[ attributes.map { |k, v| [k.underscore, v] } ]