为什么不推荐使用Enumerable#each_with_object?

问题描述 投票:14回答:3

根据ApiDock,不推荐使用Ruby方法Enumerable#each_with_object。除非弄错了(说“不赞成在最新的稳定版本的Rails上使用”,让我怀疑是因为不赞成使用Rails的猴子修补程序,否则为什么不赞成使用它?

ruby enumerable
3个回答
10
投票

嗯,这似乎有点不可思议。

甚至敏捷Rails在某处写道:

“发现Ruby 1.9 each_with_object方法非常方便,Rails团队为您将其反向移植到Ruby 1.8”。

这似乎是APIdock中的错误?我看不出会有什么原因。


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

  • 当初始元素是mutable对象,例如ArrayHashString时,可以使用each_with_object

  • 当初始元素是immutable对象,例如Numeric时,您必须使用以下inject

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


10
投票

[Ruby主干源代码中没有注释,方法[[is]]仍然存在(与该页面的声明相反,而且在我能找到的邮件列表中也没有谈论它。APIdock简直是困惑。 APIdock说它已被弃用的地方实际上是标准库中带有该方法的最早版本(而不只是一个ActiveSupport反向扩展),如果您使用的是带有该方法的Ruby,Rails会禁用其版本,因此APIdock似乎对在项目之间迁移的方法感到困惑。

© www.soinside.com 2019 - 2024. All rights reserved.