在这两种情况下,自我都是一样的吗?
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?
答案 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方法只是某个对象响应的实例方法。以下是如何实现的:
这里不明显的是实际类和单例类之间的实际关系。可以说它位于类和对象之间。
更确切地说,单例类从实际类继承,实际上是对象的类。
为什么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
。
这有效地隐藏了你的所有这些复杂性,这是一件好事。但是,了解事情如何在幕后工作也很棒。这里的逻辑同样适用于类方法,它们实际上只是Class
或Module
实例的单例方法。