根据APIdock,不推荐使用 Ruby 方法Enumerable#each_with_object
。
除非它是错误的(说“在最新的稳定版本的 Rails 上已弃用”让我怀疑可能是 Rails 的猴子补丁被弃用了),为什么它被弃用?
根据APIdock,不推荐使用 Ruby 方法Enumerable#each_with_object
。
除非它是错误的(说“在最新的稳定版本的 Rails 上已弃用”让我怀疑可能是 Rails 的猴子补丁被弃用了),为什么它被弃用?
这是对否认您的问题的预设的回答,也是为了确定它是什么。
该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",
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
Ruby 主干源代码中没有注释,该方法仍然存在(与该页面的声明相反),并且在我可以找到的邮件列表中没有谈论它。
APIdock 简直是一头雾水。APIdock 说它已被弃用的地方实际上是标准库中具有该方法的最早版本(而不仅仅是一个 ActiveSupport 反向端口扩展),如果您使用的是具有该方法的 Ruby,Rails 会禁用它的版本,所以 APIdock似乎对项目之间迁移的方法感到困惑。
嗯,这似乎有点奇怪。
甚至敏捷 Rails 在某处写道:
“
each_with_object
发现 Ruby 1.9 方法非常方便,以至于 Rails 工作人员为您将其反向移植到 Ruby 1.8”。
这似乎是 APIdock 中的错误?我看不出有什么理由。