Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 为单例方法而不是类方法添加了方法_Ruby - Fatal编程技术网

Ruby 为单例方法而不是类方法添加了方法

Ruby 为单例方法而不是类方法添加了方法,ruby,Ruby,我真的不明白这一点: 在处理singleton_method_added和method_added时,有一个重要的细微差别值得理解 对于这两个回调,人们最自然的想法是假设添加的方法将观察实例方法和添加的单例方法,即类方法。然而,这并不完全正确;Ruby的singleton对象支持普通对象,并包含特定于对象的更改。对于类,这些是类方法。但是,当向单个常规对象添加方法时,仅向该对象添加实例方法会修改该对象的单例对象 让我通过让你解决这个练习来告诉你为什么 这项工作是: AN_OBJECT = Obj

我真的不明白这一点:

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

对于这两个回调,人们最自然的想法是假设添加的方法将观察实例方法和添加的单例方法,即类方法。然而,这并不完全正确;Ruby的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
但规格仍然不合格

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

单例对象是一种“元对象”吗?它的存在仅仅是为了给对象的某个实例提供行为?这真让我困惑。

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
AN_OBJECT=OBJECT.new
定义一个对象。添加方法
@@方法| |=[]
结束
定义一个对象。添加了单例方法
@@单例|u方法|u添加| |=[]
结束
定义一个对象。添加了单例方法(方法名称)
@@单例|u方法|u添加| |=[]

@@singleton_methods_补充道,我认为这是书中的一个打字错误,应该改为“singleton类”。我明白了,谢谢你的澄清@abustamam你能通过测试吗?不,我承认我放弃了那个特定的任务。你没有创建“def AN_OBJECT.method_added(method_name)”,因为练习告诉我们我们不想向它添加方法。