Ruby에서 반복하는 동안 배열을 수정하려면 어떻게해야합니까?


88

나는 루비를 배우는 중이므로 이것이 너무 초보자라면 사과하지만 곡괭이 책에서 이것을 해결할 수는 없습니다 (아마 충분히주의 깊게 읽지 않을 것입니다). 어쨌든, 다음과 같은 배열이 있다면 :

arr = [1,2,3,4,5]

... 배열의 각 값에 3을 곱하고 싶습니다. 다음을 수행했습니다.

arr.each {|item| item *= 3}

... 내가 원하는 것을 얻지 못할 것입니다 (그리고 왜 배열 자체를 수정하지 않는지 이해합니다).

내가 얻지 못하는 것은 반복자 후 코드 블록 내부에서 원래 배열을 수정하는 방법입니다. 나는 이것이 매우 쉽다고 확신합니다.

답변:


140

map이전 어레이에서 새 어레이를 만드는 데 사용 합니다.

arr2 = arr.map {|item| item * 3}

map!배열을 수정하는 데 사용 합니다.

arr.map! {|item| item * 3}

온라인 작업보기 : ideone


2
정말로 각 요소를 수정해야한다면 map을 사용하는 것이 확실히 더 우아 할 것입니다.
fresskoma

2
그리고 배열 자체를 수정하려면 map을 사용하십시오! 대신
Yoann Le Touche

18

배열을 직접 수정하려면 arr.map! {|item| item*3}. 원본 (일반적으로 선호 됨)을 기반으로 새 배열을 만들려면 arr.map {|item| item*3}. 사실, 난 항상 사용하기 전에 두 번 생각 each일반적으로 같은 고차원 적 기능이 있기 때문에, map, select또는 inject그게 내가 원하는 것을.


열거 작업을 수행하지 않으려면 어떻게합니까? arr.map!{ destructive_op}영구적으로 변화 하는 것과 같은 일 을 하고 싶다면 어떻게해야 arr합니까?
밝은 성급

1
@TrevorAlexander : 무슨 뜻인지 잘 모르겠습니다. 세부 사항과 물건을 포함한 실제 질문으로 물어볼 가치가 있습니다.
Chuck

그것에 대해 생각해야 할 것입니다. 매우 좁은 요소 수정 외에 구조에 대한 어떤 파괴적인 작업을 열거 할 수 없습니까?
밝은 별

@TrevorAlexander : 아직도 이해가 어렵습니다. 구조의 내용을 볼 수 없으면 내용을 변형 할 수 없습니다. 구조를 수정하는 데 관심이없고 대신 변수를 할당하고 싶은 것처럼 들리지만 오해 할 수도 있습니다.
Chuck

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.