2014-11-21 45 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 

我希望這種方法可以允許不指定局部變量的方法鏈接,即返回103而不是100.這是怎麼回事?紅寶石方法鏈中間值

+1

「tap」點不允許您在不更改方法鏈的情況下插入代碼。它返回'self'。 – Linuxios 2014-11-21 22:28:30

回答

3

也許the tap documentation可以清除它?

產生x到塊中,然後返回x。該方法的主要目的是「挖掘」方法鏈,以便對鏈中的中間結果執行操作。

你想讓它回到y,但它並沒有做到這一點,它返回x回鏈。

它有效地做:

def tap(x) 
    yield x 
    x 
end 
+0

啊!如何將'y'返回到類似的效果? – user3888415 2014-11-21 22:29:38

+0

'z = bar(foo(10))'? – 2014-11-21 22:35:03

1

bar方法需要y並返回y+3但它不試圖修改y。要使bar具有您想要的效果,它需要修改其參數。不幸的是,數字在紅寶石中是不可變的。您可以爲變量(即不同的對象(即使用不同的對象)分配不同的編號),但不能更改原始對象。 如果使用可變對象,如字符串,讓bar做一些變異獲取傳遞的字符串,那麼你可以使用你的tap結構:

def foo(x) 
    x*10 
end 

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

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

對於這樣的數字對象,你可以使用傳統的程序鏈接[ bar(foo(10))]。