为什么after_find和after_initialize事件的回调是将它们定义为方法?

为after_find和after_initialize事件定义回调的唯一方法是将它们定义为方法。 如果你尝试使用第二种方法将它们声明为处理程序,它们将被默默地忽略。

任何人都能解释为什么会这样吗?

为什么专门为这两个回调?

编辑

从书中: – Rails必须使用reflection来确定是否有要调用的回调。 在进行真正的数据库操作时,与数据库开销相比,这样做的成本通常并不显着。 但是,单个数据库select语句可能返回数百行,并且必须为每个行调用两个回调。 这会显着减慢查询速度。 Rails团队认为,在这种情况下,性能胜过一致性。 我勒个去…!!!! 多数民众赞成……这就是解释…… !!!

来自API :

after_find和after_initializeexception

因为为查找器找到并实例化的每个对象调用了after_find和after_initialize,例如Base.find(:all),所以我们必须实现一个简单的性能约束(在简单的测试用例上速度提高50%)。 与所有其他回调不同,只有在定义了显式实现(def after_find)时才会运行after_find和after_initialize。 在这种情况下,将调用所有回调类型。