首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >class_eval对instance_eval

class_eval对instance_eval
EN

Stack Overflow用户
提问于 2012-04-24 16:34:57
回答 2查看 1.7K关注 0票数 8

除了class_evalinstance_eval之外,def在工作方式上有什么不同吗?在class_evaldef中,将方法定义为类本身(即实例方法),内部instance_eval def将方法定义为类的特征类(即类方法)。在这两种情况下,AFAIK所有其他特性的工作原理相同(例如,define_methodattr_accessorclass << self; end、定义常量)。是真的吗?

的答案是defundefalias对于class_evalinstance_eval有不同的上下文。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-24 21:11:22

长话短说:

  • Object.instance_eval &block集:
    • selfObject
    • The“当前类”到Object.singleton_class

  • Object.class_eval &block集:
    • selfObject
    • The“当前类”到Object

“当前类”用于defundefalias,以及常量和类变量查找。

现在,让我们看一下实现细节。

下面是在C中实现module_evalinstance_eval的方式:

代码语言:javascript
复制
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 argcVALUE *argvVALUE klassVALUE self

请注意:

  • module_eval传递ModuleClass实例,因为klassself
  • instance_eval都将对象的单例类传递为klass

如果给定一个块,specific_eval将调用yield_under,它使用以下参数:VALUE underVALUE selfVALUE values

代码语言:javascript
复制
if (rb_block_given_p()) {
    rb_check_arity(argc, 0, 0);
    return yield_under(klass, self, Qundef);
}

yield_under中有两条重要的行

  1. block.self = self;

这将将块的receiver.

  • cref = vm_cref_push(th, under, NOEX_PUBLIC, blockptr);设置为self

cref是一个链接列表,它指定用于defundefalias以及常量和类变量查找的“当前类”。

这一行基本上将cref设置为under

最后:

代码语言:javascript
复制
- When called from `module_eval`, `under` will be the `Class` or `Module` instance.
- When called from `instance_eval`, `under` will be the _singleton class_ of `self`.

票数 16
EN

Stack Overflow用户

发布于 2012-04-24 18:23:22

instance_eval允许您直接访问实例的实例变量,并将self用作对实例的引用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10302138

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档