代码之家  ›  专栏  ›  技术社区  ›  dreamPr

创建链接列表时,Squeak Smalltalk出现“adaptToNumber:and Send:”错误

  •  4
  • dreamPr  · 技术社区  · 10 年前

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

    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个数字(235)的列表,如果aa=4,那么列表应该是(2357),以此类推。

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

    代码运行不好,我得到:

    MessageNotUnderstood: adaptToNumber:andSend:
    

    我不知道怎么了。

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

    setValue: i 
    a := i.
    
    getNext
    ^next
    
    
    addLinkedValue: n
    next := Test new setValue: n.
    
    1 回复  |  直到 10 年前
        1
  •  2
  •   Leandro Caniglia Charlie    10 年前

    问题就在这一行:

    [aNumber \\ current] whileFalse:
    

    因为 aNumber 是一个 Integer 但是 current 不是。事实上 现在的 是的实例 Test 等级,因此 a编号 不知道如何处理消息 \\ 当论点( 现在的 在这种情况下)不是 整数 .

    什么是接收者 a编号 试图解决这个问题的做法是要求论点应对这种情况,这样做会让论点 adaptToInteger: aNumber andSend: #quo: .

    请注意,选择器不是 \\ 但是 quo: 原因就在这里 \\ 实现,这使接收者意识到该参数不是 整数 在发送消息之前 现状: .

    现在,考虑到您尚未实现 adaptToInteger:andSend: 在里面 测验 实现继承自 Object 进入场景和实例 测验 接收 adaptToNumber:andSend: ,更一般。

    一个解决方案就是在 测验

    adaptToNumber: aNumber andSend: aSymbol
        ^aNumber perform: aSymbol withArgument: a
    

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

    说到这里,我建议您也修改代码,使其更简单。