Ruby Object中是否有一个方法将自身传递给块或proc?

时间:2012-07-10 22:38:21

标签: ruby methods

我认为在Ruby中使用类似的东西是很自然的:

class Object
  def yield_self
    yield(self)
  end
end

是否存在这样的方法? (我还没有找到。)有没有人认为拥有它会很好?

3 个答案:

答案 0 :(得分:2)

截至2017年6月,

yield_self已于一个月前添加到ruby核心。https://bugs.ruby-lang.org/projects/ruby-trunk/repository/revisions/58528

它在版本号58528之后的ruby 2.5.0中,虽然我还不确定如何获得该代码。也许如果有人知道他们如何编辑这个答案

答案 1 :(得分:1)

我不明白你为什么要这么复杂:

Object.new.yield_self do |foo|
  ...
end

当以下几乎完全等效时:

foo = Object.new
...

答案 2 :(得分:1)

确实tap方法几乎完全符合您的要求:

x = [].tap do |array|
  array << 'foo'
  array << 9
end
p x

#=> ["foo", 9]

正如Rob Davis指出的那样,tap和你的方法之间存在微妙但重要的区别。 tap的返回值是接收者(即我的示例中的匿名数组),而方法的返回值是块的返回值。

您可以在the source for the tap method中看到这一点:

VALUE
rb_obj_tap(VALUE obj)
{
    rb_yield(obj);
    return obj;
}

我们将返回传递给函数的obj而不是rb_yield(obj)的返回值。如果这种区别至关重要,那么tap就不是您所需要的。否则,它似乎很合适。