gpt4 book ai didi

ruby self.class.class_eval 或 singleton_class.class_eval

转载 作者:数据小太阳 更新时间:2023-10-29 06:45:46 25 4
gpt4 key购买 nike

我这样做有什么区别

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

谢谢

附言。塔斯回答说在这个例子中,singleton_class 会为每一个新的对象返回不同的object_id,因为一个singleton_class 只属于一个Object。但是 IRB 显示下一个

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类在方法查找算法中:总是在单例类(及其模块)中搜索方法,只有在这里找不到它,才会在中搜索.

这意味着如果我们添加方法 test到类的第一个实现 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

关于ruby self.class.class_eval 或 singleton_class.class_eval,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9066979/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com