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。这里发生了什么事?
发布于 2014-11-22 06:28:18
也许the tap documentation可以澄清这一点?
将x返回给块,然后返回x。此方法的主要目的是“敲击”方法链,以便对链中的中间结果执行操作。
您希望它返回y,但它没有这样做,它将x返回到链中。
它有效地做到了:
def tap(x)
yield x
x
end发布于 2014-11-22 06:57:55
您的bar方法接受y并返回y+3,但它不会尝试修改y。为了使bar具有您想要的效果,它需要修改其参数。不幸的是,数字在ruby中是不可变的。您可以将不同的数字分配给一个变量(即,一个不同的对象(即,具有不同的object_id)),但您不能更改原始对象。如果您使用字符串等可变对象,并让bar执行某些操作来更改传入的字符串,那么您可以使用tap构造:
def foo(x)
x*10
end
def bar(y)
y << '3'
end
foo('a').tap{|x| bar(x)} #=> "aaaaaaaaaa3"对于像numbers这样的对象,您可以使用经典的过程化链接bar(foo(10))。
https://stackoverflow.com/questions/27071401
复制相似问题