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

问题描述

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

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

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

解决方法

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

在(每个)Smalltalk 类中可以重新定义以修改它们。通常你会从一个简单的方法开始

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

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

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

这样做时,完全相同的类对象 Volcano 将保持不变,并且您的实例(如果有的话)将获得两个新插槽(一个用于 location,另一个用于 {{1} }}).

更一般地说,重新定义类的能力包括进化模型可能需要的所有操作:

  • 添加/删除/重命名实例变量
  • 添加/删除/重命名类变量
  • 添加/删除/重命名类实例变量
  • 更改超类
  • 重命名类
  • 将类移动到另一个包

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

因此,您的特定问题需要再次诊断。告诉我们您遇到了什么“失败”,以便我们更好地了解发生了什么。


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

active

顺便说一句,你可以用一个语句来写:

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

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...