1

我想知道为什么以下内容在 GNU Smalltalk 中不起作用:

Object subclass: Foo [ ] new printNl

我期待打印输出类似“a Foo”的东西,但 gst 打印的是“nil”。这看起来是不是有点奇怪?

4

2 回答 2

2

这被解释为两个陈述。第一个是

对象子类:Foo [ ]

第二个是

新印刷品Nl

其中新变量未定义,因此为 nil。

于 2009-03-12T16:27:22.703 回答
2

Object subclass: Foo []不是“通常”的 Smalltalk 语法,它是最近添加的,旨在使其在文件中编码变得实用。在此之前,没有专门的语法来声明类,因为它们将由图像中的命令创建。由于以下几个原因,按照您的预期解释此代码是错误的:

  • 首先,如果subclass:是发送到的真实消息Object,则Foo应该解析为某事,这是不可能的,因为它刚刚被声明。然而,在幕后,编译器做了类似的事情Object subclass: #Foowhere #Foois a symbol 为要创建的新类的名称。可以像这样编写所有代码,除非您不能直接使用类名(因为在读取代码时它们还不存在)。你必须(Smalltalk at: #Foo) new printNl到处做。所以整个形式Object subclass: Foo [ ]是纯语法,只是声明应该创建这个类,并不意味着此时应该向 发送消息Object,等等

  • 其次,您不想在算法中间创建类并立即向它们发送消息,这作为一种开发实践会非常难看。请注意,必须在系统中注册类,以便浏览器可以显示它们,编译器可以自动重新编译依赖项,版本控制可以记录它们等等。另外,如果您的代码不小心运行了两次怎么办?您是否应该获得第二堂课而忘记上一堂课?因此,通常只有编译器、浏览器和其他元编程工具才能创建新类,并且只能在程序员的请求下进行。

于 2009-04-09T19:07:25.687 回答