为什么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
所以尽可能使用它是好的。 但是有一个限制。 我也在这里回答,
-
当初始元素是可变对象(如
Array
,Hash
,String
,可以使用each_with_object
。 -
当初始元素是不可变对象(如
Numeric
,您必须使用如下inject
。
sum =(1..10).inject(0){| sum,n | sum + n}#=> 55
在Ruby主干源代码中没有任何注释,该方法仍然存在(与该页面的声明相反),并且在我可以找到的邮件列表上没有谈论它。
APIdock很简单。 APIdock说它已被弃用的地方实际上是标准库中使用该方法的最早版本(而不仅仅是ActiveSupport反向扩展),如果您使用的是具有该方法的Ruby,则Rails会禁用其版本,因此APIdock似乎对项目之间迁移的方法感到困惑。