为什么可以使用Enumerable#each_with_object?

时间:2011-03-30 01:46:24

标签: ruby enumerable

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

3 个答案:

答案 0 :(得分:50)

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


方法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

所以尽可能使用它是好的。但是有一个限制。我也回答了here

  • 如果初始元素是可变对象,例如ArrayHashString,则可以使用each_with_object

  • 如果初始元素是不可变对象,例如Numeric,则必须使用inject,如下所示。

  

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

答案 1 :(得分:10)

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

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

答案 2 :(得分:9)

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