2016-11-26 10 views
3

내가 지난 몇 주 동안 루비를 배우고 있고 내가 좋아하는 뭔가 건너 온 : 10이 방법으로 Array # reduce를 사용하면 어떻게됩니까?

코드의 목적에 따라 평가

array = [10, 20, 20]; 

array.reduce(:^) 

# => 10 

것은 홀수 인 요소를 찾는 것이 었습니다 [10, 20, 20]과 같은 시퀀스 내의 발생.

누구나 어떻게 작동하는지 간단히 설명 할 수 있습니까?

답변

5
array = [10, 20, 20]; 

array.reduce(:^) 
    #=> 10 

array.reduce { |t,n| t^n } 
    #=> 10 

는 이제 무슨 일이 일어나고 있는지 볼 수있는 puts 문을 추가하자 같은 결과를 생성합니다. 수신기 (10) 및 블록에 전달 된 첫 번째 요소의 첫 번째 요소에 동일하게 설정된다 Enumerable#reduce은 "메모"(블록 변수 t) 인수를 부여하지 않은 경우

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 

는의 번째 요소이고 수신기, 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#^비트 배타적 OR 연산자 (XOR)입니다.

(10^20)^20 #=> 10 

홀수 번 호를 필터링하는 방법을 잘 모르겠습니다.

1

reduce은 이진 연산을 적용하여 의 모든 요소를 ​​결합합니다. ^은 비트 배타적 OR (XOR) 연산자입니다.

array.reduce(:^)array의 요소의 비트 XOR을 수행합니다. array = [10, 20, 20]의 경우이 값은 (10^20)^20이며 결과는 10입니다.

숫자와 비트의 XOR은 0이고 XOR은 연관입니다 (순서는 중요하지 않음). 따라서 어레이의 동일한 숫자 쌍은 모두 소거되어 홀수 번 발생하는 임의의 숫자의 배타적 논리합을 남깁니다. 배열에 홀수 번 발생하는 단일 번호가 있으면이 번호가 결과가됩니다.