Smalltalk 何时发送类端初始化?

Smalltalk 何时发送类端初始化?,smalltalk,pharo,squeak,Smalltalk,Pharo,Squeak,我很好奇类端初始化消息何时在Smalltalk中发送(尤其是Pharo和Squeak)。有什么特别的订单吗?假设所有其他打包的类已经加载和编译,或者系统急切地进行初始化(甚至在完成加载和编译其他类之前发送initialize)至少安全吗?当您询问加载和编译时,我假设您的意思是加载代码时 加载包或变更集时,在安装所有代码后调用类端#initialize方法。虽然不能依赖于特定的顺序,但可以假设该包中的所有类和方法都已加载 正如Bert所指出的,如果您不是在加载,而是在实现类端初始化,那么您必须自己

我很好奇类端初始化消息何时在Smalltalk中发送(尤其是Pharo和Squeak)。有什么特别的订单吗?假设所有其他打包的类已经加载和编译,或者系统急切地进行初始化(甚至在完成加载和编译其他类之前发送initialize)至少安全吗?

当您询问加载和编译时,我假设您的意思是加载代码时

加载包或变更集时,在安装所有代码后调用类端#initialize方法。虽然不能依赖于特定的顺序,但可以假设该包中的所有类和方法都已加载


正如Bert所指出的,如果您不是在加载,而是在实现类端初始化,那么您必须自己发送消息。

类端初始化从不由系统发送。在开发过程中,您可以手动执行此操作(这就是为什么这些方法中有许多具有“自初始化”注释的原因)

当将一个类的代码导出到变更集中时,导出器会在最后发送一个
initialize
,这样当该类加载到另一个系统时,它就会被执行


Monticello模仿了这种行为。当第一次加载一个类时,或者当
initialize
方法的代码被更改时,它会被执行。这是因为概念上MC会动态构建一个变更集,其中包含映像中已经存在的内容和要加载的包中包含的内容的差异。如果包含一个类端
初始化
方法,它将在加载该包版本时执行。

一个确定的方法是自己测试它。Smalltalk系统使这种事情比许多其他系统更容易实现。只需定义一个自己的
MyTestClass
,然后实现自己的类端(这很重要)
初始化
消息,以便您可以自己发现它何时触发、触发频率等

initialize
    Transcript show: 'i have been INITIALIZED!!! Muwahahahah!!!'
打开
成绩单
并运行

MyTestClass initialize

工作区
。现在您可以在运行时进行归档、Monticello加载等操作。

我不认为一般情况是这样。例如,Monticello显式地进行加载后
#初始化
,这意味着它不由任何“内部”处理加载逻辑。根据您加载代码的方式,可能永远不会发送初始化(尽管对于大多数人来说,这种情况不太可能发生)。