2

我是 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 是否有任何优势。

4

2 回答 2

5

就功能而言,两行代码都不会做同样的事情。

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

从 0 开始注入是否与总和相同

一点都不。其实0这里是无关紧要的。你可以省略它,仍然得到相同的结果。

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

这两个片段中的操作非常不同。由于数据的特殊形状,它们只会产生相同的结果。这是“每个数字只有一个位设置,没有两个数字具有相同的位设置”。违反这条规则,结果就会出现分歧。


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

于 2019-10-08T15:26:31.853 回答
1

它们的意思是一样的,但只是因为你不使用Floats 并且只是因为你没有Range.

至少在某些 Ruby 实现的某些版本中,sum有一些优化和专业化,因为它们更通用inject,所以不能有。+例如,在 YARV 中,各种变体的当前实现sum几乎是 200 行,并且包括以下优化

我们为此付出的代价是sum可能会忽略 or 的猴子补丁each版本+

于 2019-10-09T06:44:29.617 回答