繁体   English   中英

为什么我不能创建一个新的子类并在同一个句子中使用它?

[英]Why can I not create a new subclass and use it in the same sentence?

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

Object subclass: Foo [ ] new printNl

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

这被解释为两个陈述。 首先是

对象子类:Foo []

第二是

new printNl

新变量未定义的地方,因此它是零。

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

  • 首先,如果subclass:是发送给Object的真实消息,那么Foo应该解析为某些东西,这是不可能的,因为它只是被声明。 但是,在幕后,编译器会执行类似的Object subclass: #Foo ,其中#Foo是要创建的新类名称的符号。 可以编写所有这样的代码,除非你不能直接使用类名(因为它们在读取代码时还不存在)。 你不得不做(Smalltalk at: #Foo) new printNl都是。 所以整个形式的Object subclass: Foo [ ]是纯语法,只是声明应该创建这个类,并不意味着此时应该将消息发送给Object

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM