为什么Ruby不包含内置类重载?

时间:2012-09-27 11:26:37

标签: ruby language-design reloading

在典型的长时间运行的流程环境(例如rails server)中,Ruby应用程序似乎是一个常见问题,为减轻开发难度而进行的类重新加载是一个难以解决的重要问题。

令我感到震惊的是,语言最了解stdlib定义的常量,并且完全可以知道从哪些文件和什么时候加载常量,当然还可以重新加载它们。

有一些复杂的情况,require 'foo',你也定义了Bar,但这不是太难以追踪,而且define_const使用的情况也是泥泞的事情起来。线程加载是另一个问题,但我真的可以看到允许线程从磁盘文件的当前状态重新加载自己的情况。 (更快的测试服务器将被认为是#1)

它似乎应该是一种语言功能,而不是许多不同的人需要推出解决方案的东西。

总而言之,为什么这不是语言功能呢?看起来应该是这样,尽管使用情况配置文件几乎仅限于长时间运行的开发服务器。

这里的另一个问题可能是“为什么Rails不使用内置的DRB模型来快速启动开发服务器,并跳过所有类重新加载”,这也是一个有趣的讨论,但现在还不行。

1 个答案:

答案 0 :(得分:0)

为了能够自动重新加载一个类,您需要知道该类是如何构建的。鉴于Ruby的动态性,这在最微不足道的情况下很容易实现。在最终形式结束之前,通常会有一个扩展和改变的类。确定重新创建类所涉及的步骤并不容易,跟踪这些步骤可能会造成严重的性能拖累。

这很大程度上归结为一个类是方法,实例变量,类变量,常量以及其他模块和类的集合。与C ++等更多静态类型语言不同,这些语言可以随时在任何地方以任何理由声明。类的状态不是可以简单地重新生成的东西。

Rails重新加载类的方法是执行一些技巧来确保可以处理和重新加载有问题的类。 Rails还必须提供几个钩子来通知扩展,正在重新加载一个类,这样一旦它被重建就可以重新对它进行操作,否则很多扩展只会加载一次。

简而言之,看似表面上看起来微不足道的事实证明是非常棘手的。