Ruby方法链接中介值

时间:2014-11-21 22:23:52

标签: ruby block chain

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.这里发生了什么?

2 个答案:

答案 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))]。