Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Ruby中重写元类构造函数_Ruby - Fatal编程技术网

如何在Ruby中重写元类构造函数

如何在Ruby中重写元类构造函数,ruby,Ruby,我希望在运行任何其他静态方法之前先运行一段代码,是否可以按照下面的精神执行某些操作 class MyClass def self.initialize @stuff = 1 end def self.print_stuff puts @stuff end end 我感兴趣的Ruby版本是2.3。没有显式元类初始值设定项。该类本身是按定义“初始化”的,因此这样做完全有效: class MyClass # Code here will be executed a

我希望在运行任何其他静态方法之前先运行一段代码,是否可以按照下面的精神执行某些操作

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

我感兴趣的Ruby版本是2.3。

没有显式元类初始值设定项。该类本身是按定义“初始化”的,因此这样做完全有效:

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中定义类需要向适当的上下文对象发送一系列消息(方法调用),例如所定义的类本身。

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

这就是元编程方法的工作原理
attr\u reader
是一个私有方法调用,其中隐式的
self
是类。因此,长话短说,您不受类主体的限制,您可以在类的上下文中运行任何代码:

class MyClass
  @stuff = 1

  def self.print_stuff
    puts @stuff
  end
end

用简单的
@stuff=1
替换方法
MyClass::initialize
。当解析类定义时,类实例变量
@stuff
被赋值为
1
。我认为元编程标签在这里不合适。如果你发明了自己的术语而没有定义它,那么很难弄清楚你在问什么。Ruby中没有静态方法,Ruby也没有构造函数。