从0开始注入和sum一样吗

Does inject starting from 0 mean the same as sum

我是 ruby 的新手,正在研究一段代码

scope_value = {"tickets_scope"=>"1", "changes_scope"=>"8", "solutions_scope"=>"15"}
scope_value.values.map { |i| 2** i.to_i }.inject(0, :|)

我意识到了

scope_value.values.map {|i| 2** i.to_i }.sum

也做同样的事情

就功能而言,这两行代码做的事情不是一样的。在性能方面使用 sum 比其他有什么优势。

In terms of functionality doesn't both lines of code do the same thing.

是的,这两个片段产生相同的结果。

Does inject starting from 0 mean the same as sum

不,一点也不。事实上,0在这里是无关紧要的。您可以省略它并仍然得到相同的结果。

scope_value.values.map { |i| 2** i.to_i }.inject(:|)

这两个片段中的操作非常不同。由于数据的特殊形状,它们只会产生相同的结果。即 "each number has only one bit set and no two numbers have the same bit set"。违反此规则,结果会有所不同。


顺便说一句,在我们有 .sum 之前,我们曾经用 .inject(:+) 来模拟它。 做同样的事情(当用于整数数组时)

他们意思是一样的,但是因为你不使用Float只有因为你没有Range.

至少在某些 Ruby 实现的某些版本中,sum 有一些 inject+ 不能拥有的优化和专业化,因为它们更多一般的。例如,在 YARV 中,the current implementation of the various variations of sum is almost 200 lines,并包含以下优化

我们为此付出的代价是 sum 可能会忽略 each+.

的 monkeypatched 版本