내가 지난 몇 주 동안 루비를 배우고 있고 내가 좋아하는 뭔가 건너 온 : 10이 방법으로 Array # reduce를 사용하면 어떻게됩니까?
코드의 목적에 따라 평가
array = [10, 20, 20];
array.reduce(:^)
# => 10
것은 홀수 인 요소를 찾는 것이 었습니다 [10, 20, 20]
과 같은 시퀀스 내의 발생.
누구나 어떻게 작동하는지 간단히 설명 할 수 있습니까?
내가 지난 몇 주 동안 루비를 배우고 있고 내가 좋아하는 뭔가 건너 온 : 10이 방법으로 Array # reduce를 사용하면 어떻게됩니까?
코드의 목적에 따라 평가
array = [10, 20, 20];
array.reduce(:^)
# => 10
것은 홀수 인 요소를 찾는 것이 었습니다 [10, 20, 20]
과 같은 시퀀스 내의 발생.
누구나 어떻게 작동하는지 간단히 설명 할 수 있습니까?
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
reduce
은 이진 연산을 적용하여 의 모든 요소를 결합합니다. ^
은 비트 배타적 OR (XOR) 연산자입니다.
array.reduce(:^)
은 array
의 요소의 비트 XOR을 수행합니다. array = [10, 20, 20]
의 경우이 값은 (10^20)^20
이며 결과는 10
입니다.
숫자와 비트의 XOR은 0이고 XOR은 연관입니다 (순서는 중요하지 않음). 따라서 어레이의 동일한 숫자 쌍은 모두 소거되어 홀수 번 발생하는 임의의 숫자의 배타적 논리합을 남깁니다. 배열에 홀수 번 발생하는 단일 번호가 있으면이 번호가 결과가됩니다.