无法创建对象实例
Not able to create instance of object
我刚开始使用 gnu-smalltalk。我从 here 中获取了以下代码来定义 class:
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
]
]
但是,我无法创建此 class 的任何实例。我尝试了各种方法,以下给出的错误最少!
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
]
我认为通常的方法应该有一个名称和参数,从代码 here 开始:
spend: amount [
<category: 'moving money'>
balance := balance - amount
]
创建Complex
号25 + 25i
评估
Complex real: 25 imaginary: 25
我怎么知道?因为你问题的第一部分是
Complex class >> real: r imaginary: i [
<category: 'instance creation'>
^(super new) setReal: r setImag: i
]
您的错误是 Complex new: real: 25 imaginary: 25
,这不符合 Smalltalk 语法。
消息的 Smalltalk 语法,例如,2 个(或更多)参数由 2 个(或更多)关键字组成,以冒号结尾,每个关键字后跟相应的参数。
例如,方法setReal: r setImag: i
有两个关键字,即setReal:
和setImag:
,并接收两个参数r
和i
。方法的 name,在 Smalltalk 中称为它的 selector 是连接关键字的结果 Symbol
,在这种情况下setReal:setImag:
.
我刚开始使用 gnu-smalltalk。我从 here 中获取了以下代码来定义 class:
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
]
]
但是,我无法创建此 class 的任何实例。我尝试了各种方法,以下给出的错误最少!
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
]
我认为通常的方法应该有一个名称和参数,从代码 here 开始:
spend: amount [
<category: 'moving money'>
balance := balance - amount
]
创建Complex
号25 + 25i
评估
Complex real: 25 imaginary: 25
我怎么知道?因为你问题的第一部分是
Complex class >> real: r imaginary: i [
<category: 'instance creation'>
^(super new) setReal: r setImag: i
]
您的错误是 Complex new: real: 25 imaginary: 25
,这不符合 Smalltalk 语法。
消息的 Smalltalk 语法,例如,2 个(或更多)参数由 2 个(或更多)关键字组成,以冒号结尾,每个关键字后跟相应的参数。
例如,方法setReal: r setImag: i
有两个关键字,即setReal:
和setImag:
,并接收两个参数r
和i
。方法的 name,在 Smalltalk 中称为它的 selector 是连接关键字的结果 Symbol
,在这种情况下setReal:setImag:
.