Methods_ded用于Singleton方法,但不用于Class方法



我真的不理解这个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

如果你向上滚动,看看之前的练习,它应该会给你足够的提示。我这么晚才发布这篇文章,真是太悲剧了。。

最新更新