首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby方法链接中间值

Ruby方法链接中间值
EN

Stack Overflow用户
提问于 2014-11-22 06:23:52
回答 2查看 96关注 0票数 2
代码语言:javascript
复制
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。这里发生了什么事?

EN

回答 2

Stack Overflow用户

发布于 2014-11-22 06:28:18

也许the tap documentation可以澄清这一点?

将x返回给块,然后返回x。此方法的主要目的是“敲击”方法链,以便对链中的中间结果执行操作。

您希望它返回y,但它没有这样做,它将x返回到链中。

它有效地做到了:

代码语言:javascript
复制
def tap(x)
  yield x
  x
end
票数 3
EN

Stack Overflow用户

发布于 2014-11-22 06:57:55

您的bar方法接受y并返回y+3,但它不会尝试修改y。为了使bar具有您想要的效果,它需要修改其参数。不幸的是,数字在ruby中是不可变的。您可以将不同的数字分配给一个变量(即,一个不同的对象(即,具有不同的object_id)),但您不能更改原始对象。如果您使用字符串等可变对象,并让bar执行某些操作来更改传入的字符串,那么您可以使用tap构造:

代码语言:javascript
复制
def foo(x)
  x*10
end

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

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

对于像numbers这样的对象,您可以使用经典的过程化链接bar(foo(10))

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27071401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档