2

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

class Object
  def yield_self
    yield(self)
  end
end

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

4

3 回答 3

2

yield_self截至 2017 年 6 月,已在一个月前添加到 ruby​​ 核心。https://bugs.ruby-lang.org/projects/ruby-trunk/repository/revisions/58528

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

于 2017-06-04T22:56:45.920 回答
1

我不明白您为什么想要以下复杂性:

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

当以下几乎完全相同时:

foo = Object.new
...
于 2012-07-10T22:51:36.480 回答
1

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

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

#=> ["foo", 9]

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

您可以在方法的源代码中tap看到这一点:

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

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

于 2012-07-10T23:00:08.153 回答