0

次のコードでエラーが発生しないのはなぜですか。

Object.new.instance_eval { some_accessor_that_does_not_exist= "a value" }

次の例では、予想どおり NameError が発生します。

Object.new.instance_eval { some_method_that_doesnt_exist }

これでもエラーが発生します。

Object.new.instance_eval { self.some_accessor_that_does_not_exist= "a value" }

1.8.7-p352 と 1.9.3-p194 でこれを試しましたが、同じ結果が得られました。

4

1 に答える 1

1
Object.new.instance_eval { some_accessor_that_does_not_exist= "a value" }

some_accessor_that_does_not_existこれは、setter 呼び出しではなく、という名前の新しいローカル変数の作成として解釈されます。暗黙的なレシーバーで割り当てを使用する場合、ローカル変数を宣言するための特別な構文がないため、ローカル変数を作成する必要があるのか​​、メソッドを呼び出す必要があるのか​​ をルビーは認識できません。そして、ローカル変数を作成します。

しかし、明示的なレシーバー ( self.some_accessor_that_does_not_exist) を使用すると、ruby はそれをメソッドとして解釈して失敗します。

于 2013-01-04T05:17:52.127 に答える