从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,并包含以下优化
Enumerable#sum
, when applied to an Enumerable<Float>
,使用Kahan-Babuška平衡补偿求和算法,防止求和时浮点精度误差累积
Range#sum
, when applied to a Range<Integer>
使用众所周知的封闭式公式:(end - start + 1) * (end + start) / 2
end 因此与范围的大小无关,any 仅取决于所涉及数字的长度
我们为此付出的代价是 sum
可能会忽略 each
或 +
.
的 monkeypatched 版本
我是 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,并包含以下优化
Enumerable#sum
, when applied to anEnumerable<Float>
,使用Kahan-Babuška平衡补偿求和算法,防止求和时浮点精度误差累积Range#sum
, when applied to aRange<Integer>
使用众所周知的封闭式公式:(end - start + 1) * (end + start) / 2
end 因此与范围的大小无关,any 仅取决于所涉及数字的长度
我们为此付出的代价是 sum
可能会忽略 each
或 +
.