短編小説:
Object.instance_eval &block
セット:
Object.class_eval &block
セット:
self
にObject
- 「現在のクラス」から
Object
「現在のクラス」は、定数およびクラス変数のルックアップだけでなく、、、にもdef
使用undef
されます。alias
それでは、実装の詳細を見てみましょう。
Cでの実装方法module_eval
と実装方法は次のとおりです。instance_eval
VALUE rb_mod_module_eval(int argc, VALUE *argv, VALUE mod) {
return specific_eval(argc, argv, mod, mod);
}
VALUE rb_obj_instance_eval(int argc, VALUE *argv, VALUE self) {
VALUE klass;
if (SPECIAL_CONST_P(self)) { klass = Qnil; }
else { klass = rb_singleton_class(self); }
return specific_eval(argc, argv, klass, self);
}
どちらも、を呼び出します。これは、、、、およびspecific_eval
の引数を取りint argc
ます。VALUE *argv
VALUE klass
VALUE self
ご了承ください:
module_eval
Module
またはClass
インスタンスをとの両方として渡しますklass
self
instance_eval
オブジェクトのシングルトンクラスを次のように渡しますklass
ブロックが与えられた場合、は、specific_eval
を呼び出しますyield_under
。これは、次の引数を取ります:VALUE under
、VALUE self
およびVALUE values
。
if (rb_block_given_p()) {
rb_check_arity(argc, 0, 0);
return yield_under(klass, self, Qundef);
}
には2つの重要な行がありますyield_under
:
block.self = self;
これself
により、ブロックのがレシーバーに設定されます。
cref = vm_cref_push(th, under, NOEX_PUBLIC, blockptr);
は、、、、および定数とクラス変数のルックアップに
使用される「現在のクラス」を指定cref
するリンクリストです。def
undef
alias
その行は基本的にをに設定cref
しunder
ます。
ついに: