为什么Enumerable#each_with_object已被弃用?

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

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

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


方法each_with_object保存您额外的击键。 假设您要从数组中创建哈希。 使用inject ,您需要额外的h以下内容:

 array.inject({}){|h, a| do_something_to_h_using_a; h} # <= extra `h` here 

但是使用each_with_object ,您可以保存输入:

 array.each_with_object({}){|a, h| do_something_to_h_using_a} # <= no `h` here 

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

  • 当初始元素是可变对象(如ArrayHashString ,可以使用each_with_object

  • 当初始元素是不可变对象(如Numeric ,您必须使用如下inject

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

在Ruby主干源代码中没有任何注释,该方法仍然存在(与该页面的声明相反),并且在我可以找到的邮件列表上没有谈论它。

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