ruby self.class.class_eval或singleton_class.class_eval
发布时间:2020-12-16 21:48:30 所属栏目:百科 来源:网络整理
导读:当我做什么有什么不同 class Tdef initialize self.class.class_eval do def test return self.class.object_id end endendend 和 class Tdef initialize singleton_class.class_eval do def test return self.class.object_id end endendend 谢谢 PS. Tass
当我做什么有什么不同
class T def initialize self.class.class_eval do def test return self.class.object_id end end end end 和 class T def initialize singleton_class.class_eval do def test return self.class.object_id end end end end 谢谢 PS. 1.9.2p180 :001 > class T 1.9.2p180 :002?> 1.9.2p180 :003 > def initialize 1.9.2p180 :004?> singleton_class.class_eval do 1.9.2p180 :005 > def test 1.9.2p180 :006?> return self.class.object_id 1.9.2p180 :007?> end 1.9.2p180 :008?> end 1.9.2p180 :009?> end 1.9.2p180 :010?> 1.9.2p180 :011 > end => nil 1.9.2p180 :012 > t = T.new => #<T:0x00000100ae9cb8> 1.9.2p180 :013 > t1 = T.new => #<T:0x00000100ad7ef0> 1.9.2p180 :014 > t1.test == t.test => true 1.9.2p180 :015 > t1.test => 2153233300 1.9.2p180 :016 > t.test => 2153233300 1.9.2p180 :017 > 解决方法
这些T类的实例之间的区别在于方法查找算法:方法始终在单例类(及其模块)中搜索,只有在此处找不到,则在类中进行搜索.
这意味着如果我们在初始化之后添加方法测试到T类的第一个实现,我们将得到不同于第二个实现类T的相同的结果: # First example class T def initialize self.class.class_eval do def test return self.class.object_id end end end end t = T.new class T def test 'overriden' end end puts t.test # => 'overriden' class T def initialize singleton_class.class_eval do def test return self.class.object_id end end end end t = T.new class T def test 'overriden' end end puts t.test # => 77697390 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容