2017-09-19 4 views
-2

그래서 최근에 루비의 reduce 메소드에서 매개 변수를 넣은 순서가 결과에 영향을 미친 것으로 나타났습니다.Ruby에서 reduce 메소드의 다른 작동 메커니즘

a = ["1", "2", "3"] 
a.reduce {|val, con| val + con} 
a = ["123"] 

그러나

a.reduce {|val, con| con + val} 
a = ["321"] 

나는 단지 당신이 순서를 제공하는 방법을 중요한 생각 | 발, 사기꾼 | 페어 (con)가 후자의 위치에있는 경우, 모든 단계의 결과는 항상 사기차에 저장됩니다. 그리고이 두 가지는 동일한 결과를 가져와야합니다. 그러나 분명히 여기에 없습니다.

누구나 유용한 정보를 제공 할 수 있습니까? 감사. 이 두 메소드가 루비에서 어떻게 구현되는지에 대한 설명은 엄청난 도움이 될 것입니다.

+1

는 https://ruby-doc.org/core-2.1.0/Enumerable.html#method-i-reduce에서 문자열 # +' – Ilya

+0

문서 도구 '에 대해 읽어 행동과 소스 코드의 설명을 포함하시기 바랍니다 –

+0

'String # +'은 비 교환 적이기 때문에 결과가 변경되는 것은 놀라운 일이 아닙니다. 같은 이유로 "Hello"+ "World"는 "World"+ "Hello"와 같지 않습니다. –

답변

0

블록의 첫 번째 매개 변수는 메모이며, 솔루션을 작성하는 개체이며, 후자는 컬렉션의 "현재 항목"입니다. 따라서 첫 번째 예제에서는 두 번째 예제의 메모 앞에 메모 뒤에 항목을 연결합니다. 두 가지 방법 모두 합법입니다. 결국 그것은 당신이해야하는 일에 달려 있습니다.

+1

그건 의미가 있습니다. 나는 실수로 후자의 결과가 "붕괴"되는 것이라고 생각했다. 팁 고마워. –

+0

당신을 환영합니다;) – Ursus

1

각 단계를 인쇄하여 진행 상황을 확인하십시오.

a = %w{1 2 3} 
a.reduce {|memo, obj| 
    puts "memo is #{memo} and obj is #{obj}" 
    puts "new memo is #{memo + obj}", "="*23 
    memo + obj 
} 

#memo is 1 and obj is 2 
#new memo is 12 
#======================= 
#memo is 12 and obj is 3 
#new memo is 123 
#======================= 

a.reduce {|memo, obj| 
    puts "memo is #{memo} and obj is #{obj}" 
    puts "new memo is #{obj + memo}", "="*23 
    obj + memo 
} 

#memo is 1 and obj is 2 
#new memo is 21 
#======================= 
#memo is 21 and obj is 3 
#new memo is 321 
#=======================