2016-11-26 42 views
3

我一直在学习Ruby在过去的几个星期,我碰到的东西来了,如同:如何使用Array#以这种方式减少工作?

array = [10, 20, 20]; 

array.reduce(:^) 

# => 10 

其评估为10

代码的目的是找到与奇数的元素在诸如[10, 20, 20]的序列内发生。

有没有人有一个相对简单的解释这是如何工作的?

回答

5
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 
0

Fixnum#^运算符(XOR)的按位异或运算符

(10^20)^20 #=> 10 

虽然我不确定如何过滤奇数次出现的数字。

1

reduce通过应用二元运算组合了Enumerable的所有元素。 ^是按位异或(XOR)运算符。

array.reduce(:^)执行array元素的按位异或。对于array = [10, 20, 20],这执行(10^20)^20,给出结果10

数字和它自己的按位XOR是0,XOR是关联的(顺序不重要)。因此阵列中的每一对相同的数字都会被抵消,从而导致出现奇数次的任何数字的异或。如果阵列中有一个奇数次的数字,那么这个数字就是结果。

相关问题