我已经定义了列表结构,现在我正在尝试使用一些规则创建一个列表。
这是到目前为止的代码:

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].

我有获取参数 aa 的方法 printListFrom。目的是获得一个长度为 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 除以列表中的数字(当前),如果我得到该提醒为 0,我只需将 1 添加到 aNumber,如果提醒大于 0,则我将 aNumber 除以列表中的下一个数字,如果我已经将 aNumber 除以列表中的所有数字,并在每次划分后得到一些提醒,我向 i 添加 1 代表列表的长度,并且我还将 aNumber 添加到列表中。

代码运行不佳,我得到:
MessageNotUnderstood: adaptToNumber:andSend:

我不知道怎么了。

这是我在 List 方法中声明和使用的其他方法的声明:
setValue: i
a := i.

getNext
^next


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

最佳答案

问题出在这一行:

[aNumber \\ current] whileFalse:

因为 aNumberIntegercurrent 不是。实际上 currentTest 类的一个实例,因此当参数(在本例中为 aNumber )不是 \\ 时, current 不知道如何处理消息 Integer

接收方 aNumber 试图解决这个问题的方法是要求参数处理这种情况,并为此将参数通知给 adaptToInteger: aNumber andSend: #quo:

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

现在,假设您没有在 adaptToInteger:andSend: 中实现 Test ,则从 Object 继承的实现进入场景, Test 的实例接收 adaptToNumber:andSend: ,这是更通用的。

一个解决方案将包括在 Test 中实现这个方法作为
adaptToNumber: aNumber andSend: aSymbol
    ^aNumber perform: aSymbol withArgument: a

它将消息委托(delegate)给(数字)实例变量 a

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

10-08 04:14