Ruby Class和Object singleton - 获取访问权限

时间:2011-07-21 23:03:27

标签: ruby

我学习红宝石单身,并对这些代码产生误解:

class MyClass
  def self.class_singleton_mymethod
  end
end

class_singleton = class << MyClass
  self
end

puts class_singleton.methods.grep(/mymethod/)  # => []


obj = MyClass.new

def obj.object_singleton_mymethod
end

object_singleton = class << obj
  self
end

puts object_singleton.methods.grep(/mymethod/) # => class_singleton_mymethod

为什么class_singleton 包含类的 Class 方法而object_singleton而不是 Object的单例方法包含类的 Class 方法?

2 个答案:

答案 0 :(得分:2)

我认为你有methodsinstance_methods混淆的概念。如果您要将methods的所有实例替换为instance_methods,您将看到预期的结果。

instance_methods用于枚举类的实例具有哪些方法。 methods用于枚举对象具有的方法。 (类对象也是对象,并且有自己的方法,如new,这些方法不是实例方法。

例如,String#slice是一个实例方法;您可以在字符串实例上调用slice。另一方面,String.newString本身的一种方法;你没有在字符串实例上调用new,但你可以调用String.new(即在String类对象本身上)来创建一个新字符串。)

答案 1 :(得分:0)

我不确定我理解,但您是否尝试实施Singleton设计模式?

使用它为你实现的Singleton Module,你只需要包含它