Ruby - 在ruby类的元类中定义自我方法

时间:2018-01-19 12:35:34

标签: ruby metaprogramming metaclass class-method

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类方法访问它,它就不存在!!

1 个答案:

答案 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