为什么可以使用Enumerable#each_with_object?

And*_*imm 12 ruby enumerable

根据ApiDock,Ruby方法Enumerable#each_with_object已被弃用.除非它是错误的(说"在Rails的最新稳定版本上弃用"让我怀疑可能是Rails的猴子修补已被弃用),为什么它被弃用了?

saw*_*awa 50

这是对否定你的问题预设的答案,也是为了确定它是什么.


方法each_with_object可以节省额外的击键次数.假设您要从数组中创建哈希.有了inject,您需要额外h的以下内容:

array.inject({}){|h, a| do_something_to_h_using_a; h} # <= extra `h` here
Run Code Online (Sandbox Code Playgroud)

但是each_with_object,你可以保存输入:

array.each_with_object({}){|a, h| do_something_to_h_using_a} # <= no `h` here
Run Code Online (Sandbox Code Playgroud)

所以尽可能使用它是好的.但是有一个限制.我也在这里回答,

  • 当初始元素是可变对象(如Array,, Hash)时String,可以使用each_with_object.

  • 当初始元素是一个不可变对象时Numeric,你必须使用inject如下.

sum =(1..10).inject(0){| sum,n | sum + n}#=> 55

  • +1 - 感谢您澄清each_with_object和注入之间的区别! (2认同)

Chu*_*uck 10

有没有注意到在Ruby主干的源代码,方法仍然存在(与该网页的说法),并有过它的邮件列表,我可以找到没有说话.

APIdock很简单.APIdock说它已被弃用的地方实际上是标准库中使用该方法的最早版本(而不仅仅是ActiveSupport反向扩展),如果你使用的是具有该方法的Ruby,Rails会禁用它的版本,因此APIdock似乎对在项目之间迁移的方法感到困惑.


Spy*_*ros 9

嗯,这看起来有点奇怪.甚至Agile Rails也写道:"Ruby 1.9 each_with_object方法被发现非常方便,Rails工作人员将它向后推送到Ruby 1.8".看起来像apidock中的错误?我没有看到任何理由:/