Squeak Smalltalk获得" adaptToNumber:andSend:"创建链接列表

时间:2015-12-27 22:50:02

标签: 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 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,那么list应该是(2 3 5 7),依此类推。

在我的代码中,在whileTrue循环中,我将aNumber除以列表中的数字(当前),如果我得到的提醒为0我只是将1添加到aNumber,如果提醒大于0,则我将aNumber除以下一个数字如果我将aNumber除以列表中的所有数字并在每次除法后得到一些提醒,我将1添加到i表示列表的长度,并且我还将aNumber添加到列表中。

代码运行不正常,我得到了:

MessageNotUnderstood: adaptToNumber:andSend:

我不知道什么是错的。

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

setValue: i 
a := i.

getNext
^next


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

1 个答案:

答案 0 :(得分:2)

问题出在这一行:

[aNumber \\ current] whileFalse:

因为aNumberIntegercurrent不是current。实际上TestaNumber类的一个实例,因此\\在参数(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 中实现此方法

a

将消息委托给(数字)实例变量// Example program #include <iostream> #include <string> void a (const char c[][2]) { std::cout << "func c: " << (sizeof(c)/sizeof(c[0])) << std::endl; } int main() { const char c[][2] = { {1,2}, {3,4}, {5,6}, {7,8}, {9,10}, {11,12}, }; std::cout << "main c: " << (sizeof(c)/sizeof(c[0])) << std::endl; a(c); return 0; }

说完这些之后,我建议你修改代码,试图让它变得更简单。