2011-01-27 2 views
22

최근에 나는 새로운 변수에 값을 할당하기 위해 tap을 사용할 수 있음을 발견했다. 예를 들어, 생성하고,이 같은 배열을 충전 :루비 '탭'방법 - 내부 할당

array = [].tap { |ary| ary << 5 if something } 

truthy이다 arraysomething 경우에 5 밀어 조건이 코드; 그렇지 않으면 array은 비어있게됩니다.

array = [].tap { |ary| ary += [5] if something } 

array가 비어 :이 코드를 실행 한 후 왜

는하지만 이해가 안 돼요. 누구든지 나를 도울 수 있습니까?

답변

38

첫 번째 경우 arrayary은 같은 개체를 가리 킵니다. 그런 다음 << 메서드를 사용하여 해당 개체를 변경합니다. arrayary이 가리키는 개체가 변경되었습니다.

arrayary 두 경우 모두 동일한 배열을 가리 킵니다. 이제 ary 변수를 다시 할당하므로 ary이 새 배열을 가리 킵니다. 그러나 재 할당 aryarray에 영향을 미치지 않습니다. 루비 재 할당에서 변수는 다른 변수에 영향을주지 않습니다. 재 할당 전에 동일한 객체를 가리킨다 고하더라도. 자리에서 당신이 concat를 사용할 수있는 또 다른 하나 개의 배열을 추가하려면 :

x = 23 
y = x 
y = 42 # Changes y, but not x 

편집 : 즉 array에서

여전히 x은 다음 예에서 42 수 없다는 점 같은 이유로 비어 이 방법은 +=을 사용하는 것보다 빠릅니다.

+5

ADD :'a + = b'는'a = a + b'와 같이 작동합니다. - 여기 생성 사실은 새로운 객체가 더 분명합니다. – Nakilon

+1

@Nakilon : OP가 명시 적으로 과제에 대해 말하고 있었기 때문에, 나는 그 부분이 분명하다고 생각했다. – sepp2k

+0

좋아, 나는 이해했다고 생각한다; 그것은 할당 작업의 beacuse 작동하지 않습니다. 내가 원하는 결과를 얻으려면 array = [].tap { |ary| [5].each{ |v| ary << 5 } } --- 어떻게 주석에 서식을 추가 할 수 있습니까 ?? – mdesantis

20

나는이 조금에 확장하려는 :

  1. []-array, 하늘의 배열 할당 :

    array = [].tap { |ary| ary << 5 if something } 
    

    이가하는 일 (something을 가정하는 것은 틱 사실이다).

    array.object_id = 2152428060 
    
  2. ary[] 블록을 통과한다. aryarray이 동일한 배열 객체를 가리키고 있습니다.

  3. ary << 5 < <

    array.object_id = 2152428060 
    ary.object_id = 2152428060 
    
  4. 는 수신 객체를 수정한다 의미하는 추이 적 방법이다. 메소드 호출에 !을 추가하는 것과 비슷합니다. .map.map! ("메소드가 메서드 이름에서 고유 한 의미는 갖고 있지 않지만"this place in!)를 의미합니다. ary 5 삽입되므로있다 ary = array = [5]

    array.object_id = 2152428060 
    ary.object_id = 2152428060 
    

우리 array 번째 예에서 [5]

이상임 끝나야 :

array = [].tap{ |ary| ary += [5] if something }  
  1. 동일한
  2. 동일한
  3. ary += 5+=ary = ary + 5 약자이며, 그래서이 순서대로 제 1 변형 (+)하고 할당 (=)이다. 그것은 장소에서 객체를 수정하는 모습을 보여 주지만 실제로 그렇지 않습니다. 완전히 새로운 객체를 만듭니다.

    array.object_id = 2152428060 
    ary.object_id = 2152322420 
    

그래서 우리는 원래 개체, object_id=2152428060와 하늘의 배열로 arrayary, 하나 개의 항목이 object_id = 2152322420와 5가 포함 된 배열로 끝납니다. 이 후에는 ary에 아무 일도 일어나지 않습니다. 그것은 벌써 일어난 array의 원래 할당과 관련이 없습니다. Tap은 array이 할당 된 후 블록을 실행합니다.

+1

이것은 가장 훌륭한 답변과 설명입니다. – tamouse

+1

위대한 설명 - 잘 했어. – Jurgen