2014-09-04 2 views
3

다음 이유로 배열이 수정되지 않는 이유가 궁금합니다. 배열을 통해장소에서 배열 수정 - 루비

@card.map!.with_index {|value, key| key.even? ? value*=2 : value} 

어느 단지 반복, 모든 심지어 키에 대한 값을 두 배로 :

나는이 있습니다.

은 그럼 내가 수행

, 하나 개의 거대한 숫자로 배열을 결합 개별 번호로 분할 한 다음 배열에 정수로 다시 매핑
@card.join.split('').map!{|x| x.to_i} 

. 1 단계에서 2 단계로의 실제 변화는 1 단계가 a = [1,2,12]처럼 보이고 2 단계가 a = [1,2,1,2]처럼 보일뿐입니다. 두 번째 단계에서는 .map을 사용하더라도! 내가 P @ 카드를 사용하면 첫 번째 단계 후에 똑같은 것처럼 보입니다. 나는 그들이 새로운 배열로 전진하기를 원한다면 두 번째 단계를 무언가로 설정해야한다. 왜 이런거야? .map을 수행합니까? 두 번째 단계에서 자리에 배열을 수정하지? 아니면 방법의 연결이 내 능력을 무효로합니까? 건배.

+2

당신의 코퍼스를 보여줍니다. 오류를 보여주십시오. 예상 결과를 보여주십시오. –

+0

첫 번째 코드 블록에서 'value * = 2'표현은 오해의 소지가 있습니다. 대신에'value * 2'를 써야합니다. –

답변

2

tldr : 메서드 체인은 해당 체인의 모든 단일 메서드가 제자리에서 수정 메서드 인 경우 해당 위치의 개체 만 수정합니다.

중요한 차이점은 개체에서 호출하는 첫 번째 방법입니다. 첫 번째 예제에서는 배열을 수정하는 메서드 인 map!을 호출합니다. with_index은이 예제에서 중요하지 않으며 단지 map!의 동작을 변경합니다.

두 번째 예는 어레이에서 join을 호출합니다. join은 자리에 배열을 변경하지 않지만 전혀 다른 개체 인 문자열을 반환합니다. 그런 다음 split 문자열을 생성합니다.이 배열은 새로운 배열을 만들고 map! 배열을 수정합니다.

그래서 두 번째 예제에서 당신은 다시 변수에 결과를 할당해야합니다

@card = @card.join.split('').map{ |x| x.to_i } 

원하는 결과를 계산하는 다른 방법이있을 수 있습니다. 그러나 입력 및 출력 예제를 제공하지 않았으므로 달성하려는 대상이 명확하지 않습니다.

+0

멋진 감사합니다. 정말 도움이됩니다. 고맙습니다. 명확히 해 주셔서 감사합니다. – HectorOfTroy407

2

.map! 두 번째 단계에서 자리에 배열을 수정하지?

예, 변경되지만 배열은 @card가 아닙니다. split() 메서드는 새로운 배열, 즉 @card가 아닌 배열을 반환하고 map! 새 배열을 제 위치에서 수정합니다.

에 체크를 아웃 :

tap{|x|...} → x 
Yields [the receiver] to the block, and then returns [the receiver]. 
The primary purpose of this method is to “tap into” a method chain, 
in order to perform operations on intermediate results within the chain. 

@card = ['a', 'b', 'c'] 
puts @card.object_id 

@card.join.split('').tap{|arr| puts arr.object_id}.map{ |x| x.to_i } #arr is whatever split() returns 

--output:-- 
2156361580 
2156361380 

루비 프로그램의 모든 개체는 고유 OBJECT_ID 있습니다.

+0

.매우 감사. – HectorOfTroy407

+0

@ HectorOfTroy407에서 spickermann의 대답 왼쪽에있는 체크 표시의 개요를 클릭하십시오. 당신은 또한 위의 화살표를 클릭하여 spickermann의 대답을 upvote 수 있습니다. – 7stud

+0

@ HectorOfTroy407, 음, 나는 spickermann 아니에요. – 7stud