16

根据APIdock,不推荐使用 Ruby 方法Enumerable#each_with_object

除非它是错误的(说“在最新的稳定版本的 Rails 上已弃用”让我怀疑可能是 Rails 的猴子补丁被弃用了),为什么它被弃用?

4

3 回答 3

51

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


each_with_object方法为您节省了额外的击键。假设您要从数组中创建一个散列。使用inject,您需要额外h的:

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

but with each_with_object, you can save that typing:

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

So it is good to use it whenever possible, but there is a restriction. As I also answered in "How to group by count in array without using loop",

  • When the initial element is a mutable object such as an Array, Hash, String, you can use each_with_object.
  • When the initial element is an immutable object such as Numeric, you have to use inject:

    sum = (1..10).inject(0) {|sum, n| sum + n} # => 55
    
于 2011-03-30T03:01:53.527 回答
13

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

APIdock 简直是一头雾水。APIdock 说它已被弃用的地方实际上是标准库中具有该方法的最早版本(而不仅仅是一个 ActiveSupport 反向端口扩展),如果您使用的是具有该方法的 Ruby,Rails 会禁用它的版本,所以 APIdock似乎对项目之间迁移的方法感到困惑。

于 2011-03-30T02:57:51.377 回答
12

嗯,这似乎有点奇怪。

甚至敏捷 Rails 在某处写道:

each_with_object发现 Ruby 1.9 方法非常方便,以至于 Rails 工作人员为您将其反向移植到 Ruby 1.8”。

这似乎是 APIdock 中的错误?我看不出有什么理由。

于 2011-03-30T02:31:16.780 回答