【问题标题】:Why can I not create a new subclass and use it in the same sentence?为什么我不能创建一个新的子类并在同一个句子中使用它?
【发布时间】:2009-03-12 10:04:58
【问题描述】:

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

Object subclass: Foo [ ] new printNl

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

【问题讨论】:

    标签: gnu smalltalk


    【解决方案1】:

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

      1234563但是,在幕后,编译器会执行类似Object subclass: #Foo 的操作,其中#Foo 是要创建的新类名称的符号。可以像这样编写所有代码,除非您不能直接使用类名(因为在读取代码时它们还不存在)。你将不得不在整个地方做(Smalltalk at: #Foo) new printNl。所以整个Object subclass: Foo [ ]的形式是纯语法,只是声明这个类应该被创建,并不意味着此时应该向Object等发送消息
    • 其次,您不想在算法中间创建类并立即向它们发送消息,这对于开发实践来说是非常丑陋的。请注意,必须在系统中注册类,以便浏览器可以显示它们,编译器可以自动重新编译依赖项,版本控制可以记录它们等等。另外,如果您的代码不小心运行了两次怎么办?您是否应该获得第二堂 Foo 而忘记上一堂课?因此,通常只有编译器、浏览器和其他元编程工具才能创建新类,并且只能在程序员的请求下进行。

    【讨论】:

      【解决方案2】:

      这被解释为两个语句。第一个是

      对象子类:Foo [ ]

      第二个是

      新的 printNl

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

      【讨论】:

        猜你喜欢
        • 2014-12-27
        • 2021-07-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-08
        • 1970-01-01
        相关资源
        最近更新 更多