Squeak Smalltalk 在创建链接列表时出现 "adaptToNumber:andSend:" 错误
Squeak Smalltalk getting "adaptToNumber:andSend:" error when creating linked list
我已经定义了列表结构,现在我正在尝试创建一个包含一些规则的列表。
这是到目前为止的代码:
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].
我有方法 printListFrom 获取参数 aa。目的是获得一个长度为 aa 的列表。列表中不能包含可以在没有提示的情况下被列表中已有的数字划分的数字。例如,如果列表包含数字:2 3 5 并且我们需要检查 6 那么 6/2 = 3,它没有提示,所以我们不能将它添加到列表中。如果我们要查7,那么7/2=3个提醒1,7/3=2个提醒1,7/5=1个提醒2,这样的话我们可以把7加到列表中。
如果我们有 aa = 3,结果我必须得到包含 3 个数字 (2 3 5) 的列表,如果 aa = 4,则列表应该是 (2 3 5 7) 等等。
在我的代码中,在 whileTrue 循环中,我将 aNumber 除以列表中的数字(当前),如果我得到 reminder 为 0,我只需将 1 添加到 aNumber,如果 reminder 大于 0,则我将 aNumber 除以 next列表中的数字,如果我将 aNumber 除以列表中的所有数字并在每次除法后得到一些提醒,我将 1 添加到 i 代表列表的长度,并且我还将 aNumber 添加到列表中。
代码不是 运行 嗯,我得到:
MessageNotUnderstood: adaptToNumber:andSend:
我不知道怎么了。
这是我在List方法中声明和使用的其他方法的声明:
setValue: i
a := i.
getNext
^next
addLinkedValue: n
next := Test new setValue: n.
问题出在这一行:
[aNumber \ current] whileFalse:
因为 aNumber
是 Integer
而 current
不是。事实上 current
是 Test
class 的一个实例,因此 aNumber
不知道如何处理消息 \
当参数 (current
在这种情况下)不是 Integer
.
接收者 aNumber
试图解决这个问题的方法是要求参数处理这种情况,并且这样做会通知 adaptToInteger: aNumber andSend: #quo:
的参数。
请注意,选择器不是 \
,而是 quo:
。原因在于 \
的实现方式,这使得接收方在发送消息 quo:
.
之前意识到参数不是 Integer
现在,鉴于您尚未在 Test
中实现 adaptToInteger:andSend:
,从 Object
继承的实现进入场景并且 Test
的实例接收 adaptToNumber:andSend:
,比较笼统。
解决方案包括在 Test
中实施此方法,如
adaptToNumber: aNumber andSend: aSymbol
^aNumber perform: aSymbol withArgument: a
将消息委托给(数字)实例变量 a
。
话虽如此,我建议您也修改代码以使其更简单。
我已经定义了列表结构,现在我正在尝试创建一个包含一些规则的列表。 这是到目前为止的代码:
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].
我有方法 printListFrom 获取参数 aa。目的是获得一个长度为 aa 的列表。列表中不能包含可以在没有提示的情况下被列表中已有的数字划分的数字。例如,如果列表包含数字:2 3 5 并且我们需要检查 6 那么 6/2 = 3,它没有提示,所以我们不能将它添加到列表中。如果我们要查7,那么7/2=3个提醒1,7/3=2个提醒1,7/5=1个提醒2,这样的话我们可以把7加到列表中。
如果我们有 aa = 3,结果我必须得到包含 3 个数字 (2 3 5) 的列表,如果 aa = 4,则列表应该是 (2 3 5 7) 等等。
在我的代码中,在 whileTrue 循环中,我将 aNumber 除以列表中的数字(当前),如果我得到 reminder 为 0,我只需将 1 添加到 aNumber,如果 reminder 大于 0,则我将 aNumber 除以 next列表中的数字,如果我将 aNumber 除以列表中的所有数字并在每次除法后得到一些提醒,我将 1 添加到 i 代表列表的长度,并且我还将 aNumber 添加到列表中。
代码不是 运行 嗯,我得到:
MessageNotUnderstood: adaptToNumber:andSend:
我不知道怎么了。
这是我在List方法中声明和使用的其他方法的声明:
setValue: i
a := i.
getNext
^next
addLinkedValue: n
next := Test new setValue: n.
问题出在这一行:
[aNumber \ current] whileFalse:
因为 aNumber
是 Integer
而 current
不是。事实上 current
是 Test
class 的一个实例,因此 aNumber
不知道如何处理消息 \
当参数 (current
在这种情况下)不是 Integer
.
接收者 aNumber
试图解决这个问题的方法是要求参数处理这种情况,并且这样做会通知 adaptToInteger: aNumber andSend: #quo:
的参数。
请注意,选择器不是 \
,而是 quo:
。原因在于 \
的实现方式,这使得接收方在发送消息 quo:
.
Integer
现在,鉴于您尚未在 Test
中实现 adaptToInteger:andSend:
,从 Object
继承的实现进入场景并且 Test
的实例接收 adaptToNumber:andSend:
,比较笼统。
解决方案包括在 Test
中实施此方法,如
adaptToNumber: aNumber andSend: aSymbol
^aNumber perform: aSymbol withArgument: a
将消息委托给(数字)实例变量 a
。
话虽如此,我建议您也修改代码以使其更简单。