我想知道为什么以下在GNU Smalltalk中不起作用:
Object subclass: Foo [ ] new printNl
我期待打印输出类似“a Foo”的东西,但gst打印“nil”。这看起来有点奇怪吗?
答案 0 :(得分:2)
这被解释为两个陈述。第一个是
对象子类:Foo []
,第二个是
new printNl
其中新变量未定义,因此它为零。
答案 1 :(得分:2)
Object subclass: Foo []
不是“通常的”Smalltalk语法,它是最近添加的,旨在使文件中的代码实用化。在此之前,没有专门的语法来声明类,因为它们将由图像中的命令创建。按照您的预期解释此代码有几个原因是错误的:
首先,如果subclass:
是发送给Object
的真实消息,那么Foo
应解析为某些内容,这是不可能的,因为它只是被声明。但是,在幕后,编译器会执行类似Object subclass: #Foo
的操作,其中#Foo
是要创建的新类名称的符号。可以编写所有这样的代码,除非你不能直接使用类名(因为它们在读取代码时还不存在)。您必须在所有地方(Smalltalk at: #Foo) new printNl
进行操作。所以整个表单Object subclass: Foo [ ]
是纯语法,只声明应该创建这个类,并不意味着此时应该将消息发送到Object
等等
其次,您不希望在算法中间创建类并立即向它们发送消息,这在开发实践中会非常难看。请注意,必须在系统中注册类,以便浏览器可以显示它们,编译器可以自动重新编译依赖项,版本控制可以记录它们等等。另外,如果您的代码意外运行了两次,该怎么办?如果你得到第二堂课Foo而忘记前一堂课?因此,通常,只有编译器,浏览器和其他元编程工具才能创建新类,并且只能按程序员的要求进行。