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.这里发生了什么?
答案 0 :(得分:3)
也许the tap
documentation可以清除它?
向块生成x,然后返回x。此方法的主要目的是“利用”方法链,以便对链中的中间结果执行操作。
您希望它返回y
,但它不会这样做,它会将x
返回给链。
它有效地做了:
def tap(x)
yield x
x
end
答案 1 :(得分:1)
您的bar
方法需要y
并返回y+3
,但不会尝试修改y
。要使bar
具有您希望它具有的效果,它需要修改其参数。
可悲的是,数字在红宝石中是不变的。您可以为变量指定不同的数字(即,不同的对象(即,具有不同的object_id
)),但您无法更改原始对象。
如果您使用可变对象(如字符串)并让bar
执行某些操作来改变传入的字符串,那么您可以使用tap
构造:
def foo(x)
x*10
end
def bar(y)
y << '3'
end
foo('a').tap{|x| bar(x)} #=> "aaaaaaaaaa3"
对于像数字这样的对象,您可以使用经典程序链[bar(foo(10))
]。