我一直在学习Ruby在过去的几个星期,我碰到的东西来了,如同:如何使用Array#以这种方式减少工作?
array = [10, 20, 20];
array.reduce(:^)
# => 10
其评估为10
代码的目的是找到与奇数的元素在诸如[10, 20, 20]
的序列内发生。
有没有人有一个相对简单的解释这是如何工作的?
我一直在学习Ruby在过去的几个星期,我碰到的东西来了,如同:如何使用Array#以这种方式减少工作?
array = [10, 20, 20];
array.reduce(:^)
# => 10
其评估为10
代码的目的是找到与奇数的元素在诸如[10, 20, 20]
的序列内发生。
有没有人有一个相对简单的解释这是如何工作的?
array = [10, 20, 20];
array.reduce(:^)
#=> 10
产生相同的结果作为
array.reduce { |t,n| t^n }
#=> 10
让我们添加一个puts
声明,看看发生了什么。
array.reduce do |t,n|
puts "t = #{t}, n = #{n}, t^n = #{t^n}"
t^n
end
# t = 10, n = 20, t^n = 30
# t = 30, n = 20, t^n = 10
#=> 10
当Enumerable#reduce没有给出一个参数“备忘录”(块变量t
)被设置为等于所述接收器(10
),并传递给块中的第一元件的第一元件是所述第二元件接收器,20
。
Fixnum#^是bitwise "exclusive-or"运算符(XOR)。
当t #=> 10
和(第一)n #=> 20
被传递到块:
t^n #=> 30
因为
10.to_s(2) #=> "01010"
20.to_s(2) #=> "10100"
-----
(10^20).to_s(2) #=> "11110"
"11110".to_i(2) #=> 30
10^20 #=> 30
当t #=> 30
和(第二)n #=> 20
被传递到块:
t^n #=> 10
因为
30.to_s(2) #=> "11110"
20.to_s(2) #=> "10100"
-----
(30^20).to_s(2) #=> "01010"
"1010".to_i(2) #=> 10
(30^20) #=> 10