【问题标题】:Ruby's dup and clone method for Class methodsRuby 的 Class 方法的 dup 和 clone 方法
【发布时间】:2018-08-16 02:39:20
【问题描述】:

我已经阅读了一些关于 Ruby dup 和克隆方法 Ruby dup and clone 的问题。我知道 dup 不会复制 singleton 方法,而 clone 会复制任何对象。

我正在尝试检查 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 的单例方法。

【问题讨论】:

  • 你的问题是什么?
  • @PeterCamilleri 请检查问题,我想我错过了添加完整的详细信息。
  • 非常好。我没有看到更新。

标签: ruby


【解决方案1】:

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 的方法不是duped(同样需要注意的是,在类或模块上调用dup)。
  • dupclone 内部调用 initialize_copy,因此这是查找类如何覆盖 dupclone 的起点。
  • 更高版本的 ruby​​ 添加了 initialize_cloneinitialize_dup 以微调 clonedup 的覆盖。

【讨论】:

    猜你喜欢
    • 2012-04-28
    • 2015-07-17
    • 2012-02-01
    • 2012-08-10
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多