在 Pharo Smalltalk 中以编程方式创建和删除 类

Programmatically create and delete classes in Pharo Smalltalk

我正在尝试从存储在 JSON 文件中的外部定义创建 classes。我可以使用如下消息轻松创建 class:

name := 'SomeNewClass'
Object subclass: name asSymbol
       instanceVariableNames: ''
       classVariableNames: ''
       package: 'SomeNew-Package'.

这第一次工作正常,但如果我再次 运行 我的代码,它会失败,因为 class 已经存在。我一直在寻找,但我不知道如何检查 class 是否存在并在存在时将其删除?

要查看全局 (class) 是否存在,请尝试 Smalltalk includesKey: aSymbol。要删除全局,请尝试 Smalltalk removeKey: aSymbol。 (注意,可能还有其他方法可以获取到系统字典,以上代码凭记忆,没试过。)

您的代码不应失败。你看到的问题一定有不同的原因,让我解释一下原因。

在(每个)Smalltalk 中 classes 可以为了修改它们的目的而被重新定义。通常,您将从

行的简单方法开始
Object subclass: #Volcano
       instanceVariableNames: ''
       classVariableNames: ''
       package: 'SomeNew-Package'

添加一些方法和测试,然后意识到您需要一个或两个实例变量

Object subclass: #Volcano
       instanceVariableNames: 'location active'
       classVariableNames: ''
       package: 'SomeNew-Package'

这样做时,同一个 class 对象 Volcano 将保持不变,您的实例(如果有的话)将获得两个新插槽(一个用于 location 和另一个 active).

更一般地说,重新定义 class 的功能包括您可能需要演进模型的所有操作:

  • Add/Remove/Rename一个实例变量
  • Add/Remove/Rename一个class变量
  • Add/Remove/Rename一个class实例变量
  • 换超class
  • 重命名 class
  • 将class移动到另一个包

None 这些操作将解释为 class 已经存在并且无法重新定义。相反,您可以使用大量基础设施以有意义的方式启用所有这些基础设施,这不仅会重塑您的 class,还会重塑其实例和子实例。

因此,您的特定问题需要另一个诊断。告诉我们您遇到了什么“失败”,以便我们更好地了解正在发生的事情。


琐碎的评论:您的代码片段中缺少一个点来分隔两个语句。应该是

name := 'SomeNewClass'.               "<- dot added"
Object subclass: name asSymbol
       instanceVariableNames: ''
       classVariableNames: ''
       package: 'SomeNew-Package'.    "<- final dot is ok but not required"

顺便说一句,您可以将其写在一条语句中:

Object subclass: #SomeNewClass
       instanceVariableNames: ''
       classVariableNames: ''
       package: 'SomeNew-Package'