首页 > 解决方案 > 无法创建对象实例

问题描述

我刚开始使用 gnu-smalltalk。我从这里获取了以下代码来定义一个类:

Number subclass: Complex [
       | realpart imagpart |
       "This is a quick way to define class-side methods."
       Complex class >> new [
           <category: 'instance creation'>
           ^self error: 'use real:imaginary:'
       ]
       Complex class >> new: ignore [
           <category: 'instance creation'>
           ^self new
       ]
       Complex class >> real: r imaginary: i [
           <category: 'instance creation'>
           ^(super new) setReal: r setImag: i
       ]
       setReal: r setImag: i [ "What is this method with 2 names?"
           <category: 'basic'>
           realpart := r.
           imagpart := i.
           ^self
       ]
   ]

但是,我无法创建此类的任何实例。我尝试了各种方法,以下给出的错误最少!

cn := Complex new: real:15 imaginary:25
cn printNl

错误是:

complexNumber.st:24: expected object

大多数错误如下,例如,如果new关键字后没有冒号:

$ gst complexNumber.st
Object: Complex error: use real:imaginary:
Error(Exception)>>signal (ExcHandling.st:254)
Error(Exception)>>signal: (ExcHandling.st:264)
Complex class(Object)>>error: (SysExcept.st:1456)
Complex class>>new (complexNumber.st:7)
UndefinedObject>>executeStatements (complexNumber.st:25)
nil

另外,我不清楚这个有 2 个名称的方法是什么,每个名称都有一个参数:

setReal: r setImag: i [  "How can there be 2 names and arguments for one method/function?"
    <category: 'basic'>
    realpart := r.
    imagpart := i.
    ^self
]

我相信通常的方法应该使用一个名称和一个参数,如下面的代码所示

   spend: amount [
       <category: 'moving money'>
       balance := balance - amount
   ]

标签: objectgnu-smalltalk

解决方案


创建Complex数字25 + 25i评估

Complex real: 25 imaginary: 25

我怎么知道?因为你问题的第一部分是

Complex class >> real: r imaginary: i [
       <category: 'instance creation'>
       ^(super new) setReal: r setImag: i
   ]

您的错误是 write Complex new: real: 25 imaginary: 25,它不符合 Smalltalk 语法。

带有 2 个(或更多)参数的消息的 Smalltalk 语法由 2 个(或更多)关键字组成,以冒号结尾,每个关键字后跟相应的参数。

例如,该方法setReal: r setImag: i有两个关键字,即setReal:andsetImag:和接收两个参数ri。方法的名称,在 Smalltalk 中称为它的选择器,是Symbol连接关键字的结果,在本例中为setReal:setImag:


推荐阅读