1

このメソッドが無限再帰で死ぬのではなく 1 を返すのはなぜですか?

def foo
  foo ||= 1
end

foo # => 1

次のように書き直しました。

def foo
  foo.nil? ? 1 : foo
end
4

1 に答える 1

4

最初のケースでfoo ||= 1は、ローカル変数を参照します。ベアワードに代入を行うと、Ruby は常にローカル変数を作成しself.foo = ...ますdef foo=(value)||=結局のところ、演算子はただの凝った代入演算子です。

2番目の場合は代入がないので、 にヒットすると、Rubyは裸の単語をメソッド呼び出しとfoo.nil?解釈して爆発します。foo

于 2012-10-04T19:15:25.673 に答える