文档说:
但是当我在这两种构造上尝试下面的内容时,一个给了我预期的输出,但其他人没有。所以我怀疑这两种结构之间存在差异。
使用 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/