class A
@@class_var = "A class variable"
def initialize
@var = "A instance variable"
end
def m1
puts @var
end
def m2
puts @@class_var
end
end
class << A
def self.m3
puts "im m3"
end
end
方法m3会发生什么以及如何访问m3方法以及它将在类或元类中定义的位置?但是,如果我尝试使用A.m3或Object类方法访问它,它就不存在!!
答案 0 :(得分:2)
Ruby中的每个对象都有一个隐藏的单例类位于它自己和它的父类之间。
class A; end
a = A.new
a.is_a? a.singleton_class # true
a.singleton_class.superclass == A # true
# similarly
A.is_a? A.singleton_class # true
A.singleton_class.ancestors.include? Class # true
单例类非常有用,因为它允许您定义仅适用于单个对象的方法。
您可以打开对象的单例类,使用class <<
表示法对其进行更改。
class << a
def foobar
end
end
a.foobar
但是,这也是在单例类中定义方法的简写:
def a.foobar
# same effect as above
end
a.foobar
你结合了两种符号,所以你最终在A单体类的单例类中定义了一个方法。在a
的单例类中定义方法时,可以在a
上调用它,这样就可以在A的单例类中调用您的方法。
class << A
# you opened the singleton class, so self is A.singleton_class
def self.m3
puts "im m3"
end
end
A.singleton_class.m3
# in m3