如何解决在 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
。 (注意可能还有其他方法可以获取到系统字典,以上代码凭记忆,没试过。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。