Ruby方法的类方法

时间:2018-03-07 21:16:02

标签: ruby

我已经阅读了一些关于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的单例方法。

1 个答案:

答案 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.methodobject.extend(module)的行为相同。来自module的方法不是dup(在类或模块上调用dup时也有同样的警告)。
  • dupclone在内部致电initialize_copy,因此这是查找班级如何覆盖dupclone的起点。
  • 更新版本的ruby添加了initialize_cloneinitialize_dup来微调clonedup的覆盖。