ruby – class_eval vs instance_eval
class_eval和amp;有什么区别吗? instance_eval工作除了def?在class_eval块内部,def定义了类本身的方法(即实例方法),而在instance_eval中,def定义了类的本征类的方法(即类方法). AFAIK所有其他功能在两种情况下都相同(例如,define_method,attr_accessor,class<< self; end,define constants).这是真的吗? 答案是:def,undef和别名对class_eval和instance_eval有不同的上下文.
解决方法
长话短说:
>(object = Object.new).instance_eval& block sets: >自我反对 > Object.class_eval& block sets: >自我对象 “当前类”用于def,undef和别名,以及常量和类变量查找. 现在,我们来看看实现细节. 以下是在C中实现 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 self) { VALUE klass; if (SPECIAL_CONST_P(self)) { klass = Qnil; } else { klass = rb_singleton_class(self); } return specific_eval(argc,klass,self); } 两者都调用 注意: > module_eval将Module或Class实例作为klass和self传递 如果给定一个块,则specific_eval将调用 if (rb_block_given_p()) { rb_check_arity(argc,0); return yield_under(klass,self,Qundef); } yield_under中有两个重要的行: > block.self = self; 这将块的自身设置为接收器.
该线基本上将cref设置为低于. 最后: >从module_eval调用时,下面将是Class或Module实例.>从instance_eval调用时,下面将是单例类自. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- swift UIActivityIndi??catorView .hidden = false无效
- c# – Hashtables是否可序列化?
- EXT核心API详解(十一)_Ext.data.Store/GroupingStore/JsonS
- TypeError: Error #1009: 无法访问空对象引用的属性或方法
- ruby-on-rails – 识别在rails中创建的冲突日期
- c# – ASP.NET中的NetworkCredential错误
- Flex中调用本地html实现百度地图API Javascript版的一些常用
- sqlite3.ProgrammingError:无法在已关闭的数据库上运行. [
- cocos2d中的设计模式
- objective-c – 如何从OSX 10.9中的ProcessSerialNum获取PI