【问题标题】:Methods_added for Singleton methods, but not Class methodsMethods_added 用于 Singleton 方法,但不是 Class 方法
【发布时间】:2014-11-12 07:53:52
【问题描述】:

我真的不明白这个Ruby Monk exercise

在处理 singleton_method_added 和 method_added 时有一个重要的细微差别值得理解。

大脑对这两个回调采取的最自然的策略是假设method_added 将观察实例方法和singleton_method_added,类方法。然而,这并不完全正确。 Ruby 的单例对象支持普通对象并包含对象特定的更改。对于类,这些是类方法。但是,当向单个常规对象添加方法时,单独向该对象添加实例方法会修改该对象的单例对象。

让我通过让你解决这个练习来告诉你为什么。

练习是:

AN_OBJECT = Object.new

def AN_OBJECT.methods_added
  @@methods_added ||= []
end

def AN_OBJECT.singleton_methods_added
  @@singleton_methods_added ||= []
end

我的尝试是这样做:

def AN_OBJECT.methods_added
  unless AN_OBJECT.is_a?(Class)
    @@methods_added ||= []
  end
end

def AN_OBJECT.singleton_methods_added
  if AN_OBJECT.instance_of?(Object)
    @@singleton_methods_added ||= []
  end
end

但规格仍然失败。

我真的很难理解他们到底想让我做什么。什么是单例对象?据我了解,单例类是一种“元类”,其存在只是为了给类的某个实例提供行为。

单例对象是不是一种“元对象”,其存在只是为了给对象的某个实例提供行为?这让我很困惑。

【问题讨论】:

  • 我认为这是书中的错字,应该改为“单例类”。
  • 我明白了,感谢您的澄清!
  • @abustamam 你能通过测试了吗?
  • 不,我承认我放弃了那个特定的任务。

标签: ruby


【解决方案1】:

尤里卡!

AN_OBJECT = Object.new

def AN_OBJECT.methods_added
  @@methods_added ||= []
end

def AN_OBJECT.singleton_methods_added
  @@singleton_methods_added ||= []
end

def AN_OBJECT.singleton_method_added(method_name)
  @@singleton_methods_added ||= []
  @@singleton_methods_added << method_name
end

如果您向上滚动查看之前的练习,它应该会为您提供有关如何处理它的足够提示。这么晚才发这个,真是悲剧啊。。

【讨论】:

  • 你没有创建'def AN_OBJECT.method_added(method_name)',因为练习告诉我们我们不想给它添加方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-21
相关资源
最近更新 更多