2014-11-21 4 views
2
irb(main):001:0> def foo(x) 
irb(main):002:1> x * 10 
irb(main):003:1> end 
=> nil 
irb(main):004:0> def bar(y) 
irb(main):005:1> y + 3 
irb(main):006:1> end 
=> nil 
irb(main):007:0> foo(10).tap{|x| bar(x)} 
=> 100 

이 방법으로 로컬 변수를 지정하지 않고 메소드를 체인화 할 수 있기를 바랬습니다. 즉, 100 대신에 103을 반환하는 것입니다.Ruby Method 중간 값을 연결하기

+1

'탭'의 요점은 변경하지 않고 코드를 메서드 체인에 삽입하는 것을 허용하지 않습니다. 그것은'self'를 반환합니다. – Linuxios

답변

3

아마도 the tap documentation을 삭제할 수 있습니까?

x를 블록에 출력 한 다음 x를 반환합니다. 이 메소드의 주요 목적은 체인 내의 중간 결과에 대한 연산을 수행하기 위해 메소드 체인을 "탭"하는 것입니다.

y을 돌려 주길 원하지만 그렇게하지 않으면 x을 체인으로 반환합니다.

효과적으로하고있어 :

def tap(x) 
    yield x 
    x 
end 
+0

아! 어떻게하면 'y'를 비슷한 효과로 되돌릴 수 있습니까? – user3888415

+0

'z = bar (foo (10))'? –

1

귀하의 bar 방법은 y를 받아 y+3을 반환하지만이 y을 수정하지 않습니다. bar에 원하는 효과를주기 위해서는 인수를 수정해야합니다. 슬프게도 숫자는 루비에서 불변입니다. 변수 (즉, 다른 객체 (즉, 다른 object_id)와 다른 객체)에 다른 번호를 할당 할 수 있지만 원래 객체는 변경할 수 없습니다. 당신이 [고전 절차 체인을 사용할 수, 번호와 같은 개체의

def foo(x) 
    x*10 
end 

def bar(y) 
    y << '3' 
end 

foo('a').tap{|x| bar(x)} #=> "aaaaaaaaaa3" 

: 당신은 문자열로 변경 가능한 객체를 사용하고 bar이 전달됩니다 문자열을 변이합니다 무언가를 할 경우 , 당신은 당신 tap 구문을 사용할 수 있습니다 bar(foo(10))].