文档说:





但是当我在这两种构造上尝试下面的内容时,一个给了我预期的输出,但其他人没有。所以我怀疑这两种结构之间存在差异。

使用 each_with_object

%w(foo bar).each_with_object({}) { |str, hsh| hsh[str] = str.upcase }
=> {"foo"=>"FOO", "bar"=>"BAR"}

成功在这里!

使用 with_object
%w(foo bar).with_object({}) { |str, hsh| hsh[str] = str.upcase }
 => NoMethodError: undefined method `with_object' for ["foo", "bar"]:Array
    from (irb):1
    from C:/Ruby193/bin/irb:12:in `<main>'

这里失败了!

那么这两种方法有什么区别呢?

最佳答案

each 返回一个 Enumerator 对象。

%w(foo bar).each.class
=> Enumerator

因此,对于第一种情况,数组将首先转换为 Enumerator ,然后处理 with_object

如果您希望第二种情况有效,则必须将数组转换为 Enumerator。您可以使用 .to_enum.each.map 来转换数组。
%w(foo bar).map.with_object({}) { |str, hsh| hsh[str] = str.upcase }
=> {"foo"=>"FOO", "bar"=>"BAR"}

更多细节:Enumerator

关于ruby - enum#with_object 与 enum#each_with_object 有何不同?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14671881/

10-11 01:46