1

我有一个看起来像这样的代码块:

returning({}) do |hash|
attributes.each { |key, value|
        hash[key.underscore] = value
    }

end

将其重写为不使用返回魔法修复了此方法与 Ruby 1.9.3 的冲突。这真的解决了什么问题,还是我只是错过了一些明显的东西?

谢谢。

4

2 回答 2

1

我个人从未听说过returning。但是您的代码段可以用更标准的方法重写。

attributes.each_with_object({}) do |(key, value), memo|
  memo[key.underscore] = value
end
于 2013-03-31T07:51:58.063 回答
0

该方法returning在 Ruby 中从来都不是标准方法。它是在 Rails 早期版本的 Rails 的 ActiveSupport 中提供的。它是通常被称为Kestrel的 K-combinator 的实现。Ruby 核心库现在提供了一个等效的方法Object#tap。只需在您的代码段中替换这个词tapreturning它就会按您的预期工作。

但是,对于您要尝试做的事情,这根本是不必要的。使用mapand Hash::[],以获得更简单的表达式:

Hash[ attributes.map { |k, v| [k.underscore, v] } ]
于 2013-03-31T21:56:47.550 回答