Methods_added为Singleton方法,但不是Class方法

时间:2014-09-18 05:28:34

标签: ruby

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

但规格仍然失败。

我真的很难绕过他们想要我做的事情。什么是单身对象?根据我的理解,单身人士课程是一种“元类”'存在仅仅是为了给某个类的某个实例提供行为。

单个对象是一种'元对象'仅存在于为某个对象的某个实例提供行为的存在?这对我来说真的很困惑。

1 个答案:

答案 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

如果你看一下上一个练习,如果你向上滚动,它应该给你足够的提示如何处理它。这是一个悲剧,我后来发布了这么多......