我已经阅读了一些关于Ruby dup和clone方法Ruby dup and clone的问题。我了解dup
不会复制singleton
方法,克隆会复制任何对象。
我正在尝试检查w.r.t类方法,但发现它有点令人困惑: -
class User
def self.active
'all active users'
end
end
DupUser = User.dup
DupUser.active #=> all active users'
CloneUser = User.clone
CloneUser.active #=> all active users'
据我所知,类方法也只是单例方法,那么为什么User.dup
复制了active
方法,实际上是User
的单例方法。
答案 0 :(得分:2)
By design,在类或模块上调用dup
时保留单例方法 ,这是您在示例中所做的事情。当您dup
实例时,不会保留单例方法:
user = User.new
# This is a singleton method on an Object
def user.active
'all active users'
end
cloned_user = user.clone
cloned_user.active # => 'all active users'
duped_user = user.dup
duped_user.active # => undefined method `active' for #<User:0x00007fee1f89ae30> (NoMethodError)
def object.method
与object.extend(module)
的行为相同。来自module
的方法不是dup
(在类或模块上调用dup
时也有同样的警告)。dup
和clone
在内部致电initialize_copy
,因此这是查找班级如何覆盖dup
或clone
的起点。initialize_clone
和initialize_dup
来微调clone
和dup
的覆盖。