我认为在Ruby中使用类似的东西是很自然的:
class Object
def yield_self
yield(self)
end
end
是否存在这样的方法? (我还没有找到。)有没有人认为拥有它会很好?
答案 0 :(得分:2)
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
就不是您所需要的。否则,它似乎很合适。