正常方法中的“自我”与单身方法中的“自我”?

时间:2012-04-24 16:41:37

标签: ruby singleton self

在这两种情况下,自我都是一样的吗?

class Person
   def who_am_i?
     puts self       # self?
   end
end

ted = Person.new
def ted.singleton_who_am_i?
   puts self         # self?
end

ted.who_am_i?
ted.singleton_who_am_i?

3 个答案:

答案 0 :(得分:2)

是的,看起来是这样的:

class Person
  def who_am_i?
    puts self.to_yaml
  end
end

ted = Person.new
def ted.singleton_who_am_i?
  puts self.to_yaml
end

ted.who_am_i?
--- !ruby/object:Person {}

ted.singleton_who_am_i?
--- !ruby/object:Person {}

答案 1 :(得分:1)

class Foo
  def bar
    p self
  end
end

class << Foo
  def bar
    p self
  end
end

Foo.bar              #Foo (the class itself)
Foo.new.bar          #<Foo:0x10acc70> (a Foo class object)

当上下文在对象中时,self就是对象。

当上下文出现在班级中时,self就是班级。

另外我知道“singleton”对于Ruby来说是否是一个好词,因为在Ruby中,即使一个类是一个对象,“singleton”也只是将方法添加到现有对象。

答案 2 :(得分:1)

Singleton方法只是某个对象响应的实例方法。以下是如何实现的:

  1. 对象的单件类已打开;
  2. Ruby将您的单例方法定义为单例类的实例方法
  3. 这里不明显的是实际类和单例类之间的实际关系。可以说它位于类和对象之间

    更确切地说,单例类从实际类继承,实际上对象的类。

    为什么Object#class不会返回单例类,你问?好吧,它只是跳过它。 Yeah

    这是一个例子。鉴于以下课程:

    class Person
      def instance; self end  # self is the Person instance here
    end
    
    person = Person.new
    

    如果我们想为person定义单例方法,我们可以这样写:

    class << person
      def singleton; self end  # What is self in this context?
    end
    

    这大致相当于:

    class SingletonPerson < Person
      def singleton; self end  # self is the Person instance here too!
    end
    
    person = SingletonPerson.new
    

    主要区别在于Ruby知道SingletonPerson是一个单例类,所以当你调用person.class时,你实际上得到Person而不是SingletonPerson

    这有效地隐藏了你的所有这些复杂性,这是一件好事。但是,了解事情如何在幕后工作也很棒。这里的逻辑同样适用于类方法,它们实际上只是ClassModule实例的单例方法。