Array # each 대 Array # map


92
hash = { "d" => [11, 22], "f" => [33, 44, 55] }

# case 1
hash.map {|k,vs| vs.map {|v| "#{k}:#{v}"}}.join(",")
=> "d:11,d:22,f:33,f:44,f:55"

# case 2
hash.map {|k,vs| vs.each {|v| "#{k}:#{v}"}}.join(",")
=> "11,22,33,44,55"

유일한 차이점은 사례 1 사용 vs.map, 사례 2 사용 vs.each입니다.

여기 뭔 일 있었 니?

답변:


174

Array#each 배열의 각 요소에 대해 주어진 블록을 실행 한 다음 배열 자체를 반환합니다.

Array#map 또한 배열의 각 요소에 대해 주어진 블록을 실행하지만 값이 블록의 각 반복의 반환 값인 새 배열을 반환합니다.

예 : 이렇게 정의 된 배열이 있다고 가정합니다.

arr = ["tokyo", "london", "rio"]

그런 다음 실행 해보십시오 each.

arr.each { |element| element.capitalize }
# => ["tokyo", "london", "rio"]

반환 값은 단순히 동일한 배열입니다. each블록 내부의 코드 는 실행되지만 계산 된 값은 반환되지 않습니다. 코드에 부작용이 없으므로이 예제는 유용한 작업을 수행하지 않습니다.

반대로 배열의 map메서드를 호출하면 해당 요소가 map블록 실행의 각 라운드의 반환 값인 새 배열이 반환됩니다 .

arr.map { |element| element.capitalize }
# => ["Tokyo", "London", "Rio"]

이해할 수있는 완벽한 대답입니다. 단지 a .. 면책 조항 : map 함수의 반환 값을 과도하게 사용하면 잠재적으로 많은 메모리를 낭비 할 수 있습니다.
이므 란 아마드

33

부작용은 당신의 리버스 엔지니어링에 약간의 혼동을 추가하는 동일합니다.

예, 둘 다 배열을 반복 하지만 (실제로 Enumerable 에서 혼합되는 모든 항목에 대해 ) map 은 블록 결과로 구성된 배열을 반환하고 각각 은 원래 배열을 반환합니다.

각각 의 반환 값은 원래 배열이며 Ruby 코드에서는 거의 사용되지 않지만 map가장 중요한 기능 도구 중 하나입니다 .

map전달되는 블록 또는 명명 된 메서드의 결과를 포함하는 배열을 반환하는 것이 무엇입니까? 예를 들면 :

    2.2.3 :001 > [:how, :now, :brown, :cow].map &:to_s
 => ["how", "now", "brown", "cow"]

이 경우에 나는 블록을 전달하지 않고 단지를 전달 Symbol했지만 class Symbol객체는 다음과 같은 to_proc결과를 가져올 메서드를 가지고 있습니다.

[:how.to_s, :now.to_s, ...]

BTW, mapEnumerable 의 메서드 이고 각각 ( Enumerable 모듈에서 필요한 하나의 메서드 )은 Array 의 메서드 이기 때문에 문서를 찾는 데 어려움을 겪을 수 있습니다 .

퀴즈 참고 : 지도 구현은 .


13

다음은 맵이 각각 어떻게 다른지에 대한 간단한 데모입니다.

a = ["a", "b", "c"];
#Array.map
p a.map {|item| "map_" + item}
#prints ["map_a", "map_b", "map_c"]

#Array.each
p a.each {|item| "map_" + item}
#prints ["a", "b", "c"]

맵이 반환 ["map_a", "map_b", "map_c"]되는 반면 각각은 반복되지만 원래 배열을 반환합니다 ["a", "b", "c"].

따라서 각각은 배열 처리에 사용되며 맵은 처리 된 배열로 작업을 수행하는 데 사용됩니다.


4

.each 처음에 제공 한 것과 동일한 배열을 반환합니다.

[1,2,3].each { |i| i + 1 }
#=> [1,2,3]

.map 각 블록 호출의 결과에서 새 배열을 반환합니다.

[1,2,3].map { |i| i + 1 }
#=> [2,3,4]

1

Array # each 메서드는 동일한 배열을 반환합니다.

a = [1,2,3,4,5]
a.object_id #70284994490700

b = a.each {|n| n + 2}
p b #[1,2,3,4,5]
b.object_id #70284994490700 <<--- it's the same as a

Array # map 메서드는 새 배열을 반환합니다.

c = [1,2,3,4,5]
c.object_id #70219117705860

d = c.map {|n| n + 2}
p d #[3,4,5,6,7]
d.object_id #70284994343620  <<---- it's different than c

0

해시에 맵을 사용하면 암시 적으로 해시를 배열로 캐스트하므로

[["d", [11, 22]], ["f", [33, 44, 55]]]

vs.each {...}는 [ "d", [11, 22]]에 대해 [11, 22]이고 [ "f", [에 대해 [33, 44, 55] 인 마지막 평가 만 반환합니다. 33, 44, 55]]. 따라서 마지막 조인 전에

[[11, 22], [33, 44, 55]]

0

소스 배열을 변경 map하는 bang과 함께 사용할 수도 있습니다.map!


이것은 질문에 대한 답이 아닙니다. 문제는 each주어진 블록을 실행하고 원래 배열을 반환하는 의 차이에 관한 것입니다 . 및 map, 블록 실행 결과를 값으로 반환하는 배열
Sampson Crowley
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.