2

Ruby では次のようなものを用意するのが自然だと思います。

class Object
  def yield_self
    yield(self)
  end
end

ひょっとして、このような方法が存在するのでしょうか?(私は見つけていません。)他の誰かがそれを持っているといいと思いますか?

4

3 に答える 3

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 に答える
1

次の複雑さが必要な理由がわかりません。

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

以下がほぼ正確に等しい場合:

foo = Object.new
...
于 2012-07-10T22:51:36.480 に答える