我刚刚发现了 Ruby 的元编程(在使用 Ruby 7 年后,是时候了!)我有一个问题:
假设我运行一个程序,该程序使用class_eval
和其他元编程函数向一个类添加方法,有没有一种简单的方法,当重新运行同一个程序时,已经定义了这些新方法,或者我必须编写自己的系统,每次class_eval
使用,还要将生成的代码保存在一个文件中,以便下次运行程序时重新评估它?
谢谢
我刚刚发现了 Ruby 的元编程(在使用 Ruby 7 年后,是时候了!)我有一个问题:
假设我运行一个程序,该程序使用class_eval
和其他元编程函数向一个类添加方法,有没有一种简单的方法,当重新运行同一个程序时,已经定义了这些新方法,或者我必须编写自己的系统,每次class_eval
使用,还要将生成的代码保存在一个文件中,以便下次运行程序时重新评估它?
谢谢
这不是它的完成方式。一种正确的方法是,当您下次运行程序时,再次运行所有这些对define_method
, class_eval
(以及诸如此类)的调用并在运行时定义方法。
想象一下,如果生成的方法保留在您的源代码中会发生什么?您想attr_accessor
用两种新方法替换自己吗?
如果您自己编写这样的元方法并更改它会怎样。您认为所有这些保存的生成方法将如何更新?
我不知道你在哪里读到过元编程,但我强烈推荐这本书:元编程 Ruby。它应该让你头脑清醒。:)
您不能(可以使用 eval 和自组装字符串,但这不再是元编程)并且不应该这样做,即使 ruby 的标准库在程序启动时也会重新评估。
另一种可能性是分叉,独角兽就是一个很好的例子。评估所有方法定义,然后开始生成子进程,它们是“主”进程的副本。这可以节省您重新评估所有代码的时间,因为与此相比,分叉非常快。