如何在Ruby中覆盖元类构造函数

时间:2017-11-14 17:57:07

标签: ruby

我希望在运行任何其他静态方法之前运行一段代码,是否可以按照以下精神做一些事情?

class MyClass
  def self.initialize
    @stuff = 1
  end
  def self.print_stuff
    puts @stuff
  end
end

我感兴趣的Ruby版本是2.3。

2 个答案:

答案 0 :(得分:1)

Ruby中的每一块代码都是一个表达式。甚至类定义也是一系列表达式:方法定义是具有将方法添加到类的副作用的表达式。

这就是元编程方法的工作原理。 attr_reader是一个私有方法调用,其中隐式self是类。所以,长话短说,你不限制在一个类体内,你可以在课堂上下文中放置你想要运行的代码:

class MyClass
  @stuff = 1

  def self.print_stuff
    puts @stuff
  end
end

答案 1 :(得分:0)

没有明确的元类初始化器这样的东西。类本身在定义时被“初始化”,因此完全有效:

class MyClass
  # Code here will be executed as the class itself is defined.
  @stuff = 1

  def self.print_stuff
    puts @stuff
  end
end

MyClass.print_stuff

请记住,def本身是一种方法调用形式,在Ruby中定义一个类涉及向正确的上下文对象发送一堆消息(方法调用),例如正在定义的类本身。