我真的不理解这个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
但规格仍然失败。
我真的很难绕过他们想要我做的事情。什么是单身对象?根据我的理解,单身人士课程是一种“元类”'存在仅仅是为了给某个类的某个实例提供行为。
单个对象是一种'元对象'仅存在于为某个对象的某个实例提供行为的存在?这对我来说真的很困惑。
答案 0 :(得分:2)
尤里卡!
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
如果你看一下上一个练习,如果你向上滚动,它应该给你足够的提示如何处理它。这是一个悲剧,我后来发布了这么多......