我真的不理解这个Ruby Monk练习:
在处理singleton_method_aded和method_aded时,有一个重要的细微差别值得理解。
对于这两个回调,最自然的策略是假设method_aded将观察实例方法和singleton_method_aded类方法。然而,这并不完全正确;Ruby的singleton对象支持普通对象,并包含特定于对象的更改。对于类,这些是类方法。但是,当向单个常规对象添加方法时,单独向该对象添加实例方法会修改该对象的singleton对象。
让我通过让你解决这个练习来告诉你为什么。
练习是:
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
但规格仍然不合格。
我真的很难理解他们到底想让我做什么。什么是singleton对象?据我所知,单例类是一种"元类",它的存在只是为了给类的某个实例提供行为。
单例对象是一种"元对象"吗?它的存在只是为了给对象的某个实例提供行为?这对我来说真的很困惑。
Eureka!
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
如果你向上滚动,看看之前的练习,它应该会给你足够的提示。我这么晚才发布这篇文章,真是太悲剧了。。