在 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'
我正在尝试从存储在 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'