List Squeak Smalltalk getting“获得;AdaptonNumber:和Send:“发送”;创建链接列表时出错

List Squeak Smalltalk getting“获得;AdaptonNumber:和Send:“发送”;创建链接列表时出错,list,smalltalk,List,Smalltalk,我已经定义了列表结构,现在我正在尝试创建一个包含一些规则的列表。 以下是迄今为止的代码: List: aa | i start current aNumber| start := Test new setValue:2. current := start. aNumber:=3. i:=0. [i<=aa] whileTrue:[ current:=start. [aNumber \\ current =0] whileFalse: [[current getNe

我已经定义了列表结构,现在我正在尝试创建一个包含一些规则的列表。 以下是迄今为止的代码:

List: aa 
   | i start current aNumber|
start := Test new setValue:2.
current := start.
aNumber:=3.
i:=0.
[i<=aa] whileTrue:[
current:=start.
[aNumber \\ current =0] whileFalse:  
       [[current getNext = nil] ifTrue:[current addLinkedVlue:aNumber. i=i+1].current:=current getNext].
aNumber:=aNumber+1].
我不知道怎么了

下面是我在List方法中声明和使用的其他方法的声明:

setValue: i 
a := i.

getNext
^next


addLinkedValue: n
next := Test new setValue: n.

问题出在这一行:

[aNumber \\ current] whileFalse:
因为
aNumber
是一个
整数
,但
current
不是。事实上,
current
Test
类的一个实例,因此当参数(
current
在本例中)不是
整数时,
amber
不知道如何处理消息

接收者
aNumber
试图解决此问题的方法是要求参数处理这种情况,并将参数通知
adaptoInteger:aNumber and send:#quo:

请注意,选择器不是
\\
,而是
quo:
。原因在于
\\
的实现方式,这使接收者在发送消息
quo:
之前意识到参数不是一个
整数

现在,假设您没有在
Test
中实现
adaptetointeger:andSend:
,那么从
Object
继承的实现将进入场景,而
Test
的实例将接收
adaptetonnumber:andSend:
,这是更一般的

解决方案将包括在
Test
as中实现此方法

adaptToNumber: aNumber andSend: aSymbol
    ^aNumber perform: aSymbol withArgument: a
它将消息委托给(数字)实例变量
a


话虽如此,我还是建议您修改代码,使其更简单。

还有一个问题有待解决:条件(ifTrue:)不能是一个代码块[…]-条件将无条件地进行计算,但您编写了
[current getNext=nil]ifTrue:
所以,
[aNumber\\current value=0]whileFalse:
如果在Test..。@aka.nice中定义了值,则可能会起作用。然而,我仍然认为该准则值得彻底修订。
adaptToNumber: aNumber andSend: aSymbol
    ^aNumber perform: aSymbol withArgument: a