2016-07-19 5 views
3

저는 Ruby Enumerable 모듈에 대해 잘 알고 있습니다. 또는 적어도 그렇게 생각했습니다. 다음 코드를 보자왜지도 열거 형 반환 값이 예상 값을 반환하지 않습니다

names = [ "Donald", "Daisy", "Daffy" ] 

new_empty_array = [] 

new_names_array = names.map do |name| 
    new_empty_array << name 
end 

puts new_names_array.inspect 
# prints [["Donald", "Daisy", "Daffy"], ["Donald", "Daisy", "Daffy"], ["Donald", "Daisy", "Daffy"]] 

내가 제대로 map을 사용하지 않는,하지만 학생이 map 아웃 테스트 때 나는 루비 enumerables에 대한 교훈을 가르치고이 예를 통해 온되었다 알고있다. 삽 (<<) 연산자의 반환 값은 요소가 추가 된 후의 배열입니다. 그 결과가 다음과 같지 않아야합니다 :

셔블 연산자의 전체 루프 프로세스와 최종 반환 값이 처리 된 것 같습니다. 뭐라 구요?

+1

는'names''있어야 first_names'입니다? – squiguy

답변

5

귀하의 경우 map의 결과는 동일한 배열 에 대한 참조로 여러 번 구성되는 배열입니다. 세 가지 다른 배열을 만들지 않고 map 블록에서 동일한 배열을 수정합니다.

new_names_array = first_names.map do |name| 
    (new_empty_array << name).dup 
end 
보조 노트로

, 당신은 출력을 위해, 위의 코드보다 더 분명이 코드를 사용할 수 있습니다

는 기대하고 출력을 얻으려면, 당신은 할 필요가 당신이 원하는 :

(1..first_names.size).map do |num| 
    first_names.take(num) 
end 
#=> [["Donald"], ["Donald", "Daisy"], ["Donald", "Daisy", "Daffy"]] 
+0

바로 알 수 있듯이 각 반복에 대한 반환 값은'new_empty_array'이고'.map'의 마지막 반복은 3 원소로 이루어진 배열을 반환하기 때문에 맵에서 반환되는 것은 마지막 상태 인'new_empty_array'입니다 3 times –

+0

@AndrewKim'new_empty_array'는 배열에 대한 참조이며, 당신은 map에서 그것에 대한 참조를 반환하므로 배열로 그것에 대한 3 개의 참조로 끝납니다 - 모든 3 개의 참조는 반복의 끝에 3이있는 동일한 물리적 배열을 가리 킵니다 elements –

0
new_names_array = first_names.map do |name| 
    name 
end 

["Donald", "Daisy", "Daffy"]을 줄 것입니다.

각 요소 first_namesmap에 의해 생성 된 새 배열에 값을 반환하지만 대신 각 요소에 대해 새 배열 new_empty_array을 반환합니다.

이 개체는 << 세 번이고 말에 그렇게, 3 × 3 요소 세 가지 이름이 있습니다

[new_empty_array, new_empty_array, new_empty_array] = [["Donald", "Daisy", "Daffy"], ["Donald", "Daisy", "Daffy"], ["Donald", "Daisy", "Daffy"]] 
+0

@ The Tin Man, 편집을 위해 다시 thnx, 나와 같은 영어가 아닌 사람들을 수정하는 데 많은 시간을 투자해야합니다. – peter

+0

당신은'영어가 아닌 사람을 쓰는 사람 '을 의미 할 수도 있습니다 ;-) –

관련 문제