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

在Pharo Smalltalk中以编程方式创建和删除类,smalltalk,pharo,Smalltalk,Pharo,我试图从存储在JSON文件中的外部定义创建类。我可以通过以下消息轻松创建一个类: name := 'SomeNewClass' Object subclass: name asSymbol instanceVariableNames: '' classVariableNames: '' package: 'SomeNew-Package'. 这在第一次运行时效果很好,但是如果我再次运行代码,它就会失败,因为类已经存在。我一直在寻找,但我不知道如何检查类

我试图从存储在JSON文件中的外部定义创建类。我可以通过以下消息轻松创建一个类:

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

这在第一次运行时效果很好,但是如果我再次运行代码,它就会失败,因为类已经存在。我一直在寻找,但我不知道如何检查类是否存在,如果存在,如何删除它?

要查看全局(类)是否存在,请尝试
Smalltalk IncludeKey:aSymbol
。要删除全局文件,请尝试
Smalltalk removeKey:aSymbol
。(请注意,可能还有其他方法可以访问系统字典。上述代码来自内存,尚未尝试过。)

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

在(每种情况下)Smalltalk类都可以重新定义,以便修改它们。通常,您将从以下几行的简单方法开始:

Object subclass: #Volcano
       instanceVariableNames: ''
       classVariableNames: ''
       package: 'SomeNew-Package'
添加一些方法和测试,然后意识到您需要一两个实例变量

Object subclass: #Volcano
       instanceVariableNames: 'location active'
       classVariableNames: ''
       package: 'SomeNew-Package'
在执行此操作时,相同的类对象
火山
将保持不变,并且您的实例(如果有)将获得两个新插槽(一个用于
位置
,另一个用于
活动

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

  • 添加/删除/重命名实例变量
  • 添加/删除/重命名类变量
  • 添加/删除/重命名类实例变量
  • 更改超类
  • 重命名该类
  • 将类移动到另一个包
这些操作都不会解释该类已存在且无法重新定义。相反,您可以使用大量的基础设施以有意义的方式启用所有这些基础设施,这不仅会重塑类,还会重塑其实例和子实例

因此,您的特定问题需要另一个诊断。告诉我们你的“失败”是什么,这样我们就能更好地了解发生了什么


琐碎的注释:用于分隔两条语句的代码段中缺少一个点。应该是

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

try
catch
在smalltalk中不存在?@yadu,是的,语法为
aBlock on:anException do:anotherBlock
。感谢您的详细回复。它确实帮助我理解smalltalk中发生的事情。我回到了代码,现在无法复制错误,所以我不确定发生了什么。
Object subclass: #SomeNewClass
       instanceVariableNames: ''
       classVariableNames: ''
       package: 'SomeNew-Package'