2014-11-21 47 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))]。