Squeak Smalltalk -"Print specific integers" 错误消息,如何改进以及为什么?

Squeak Smalltalk -"Print specific integers" Error message, how to improve and why?

我想要的是: 从整数 1 到 130,我想打印一些已经在数组中给出的特定整数。 它们是:2 32 44 67 89 111 123 以 small-to-big 顺序存储。

这是我的代码:

|a n myArray| 

myArray := #(2 32 44 67 89 111 123). 

n := 1. 
a := myArray at: n. 

1 to: 130 do: [:i| 
        i = a 
        ifTrue: [ 
                Transcript show: i; cr. 
                n := n + 1. 
                a := myArray at: n. 
                ].  
        ]. 

除了错误消息外,输出非常好。

以我目前的水平,我不知道为什么会出现该错误消息。

Q1:为什么会出现错误信息?

Q2:我该如何改进?

更新:

我找到了另一种方法来解决这个问题:

|myArray|

myArray := #(2 32 44 67 89 111 123).

n := 1.
a := myArray at: n.

1 to: 130 do: [:i|
    i = a      
    ifTrue: [
        Transcript show: i; cr.
        n := n +1.

        n = 8
        ifTrue: [n := n - 1].


         a := myArray at: n.
        ].  
    ].

虽然长得丑

再次更新:

|a n myArray| 

myArray := #(2 32 44 67 89 111 123). 

n := 1. 
a := myArray at: n. 

1 to: 130 do: [:i| 
        i = a 
        ifTrue: [ 
                Transcript show: i; cr. 
                n := n + 1. 

                (n = 8) ifTrue:  [^'Found it!'].

                a := myArray at: n. 
                ].  
        ].

如果您单击调试按钮,您将获得调试器的访问权,它可以帮助您了解正在发生的事情。

您显示的 window 中的列表是执行堆栈。您尝试执行的片段被标记为 UndefinedObject>>DoIt。单击它,您将看到您的代码在执行时停止的位置:

myArray at: n

在调试器中有检查器,如果您单击 n,您会看到 n = 8,然后如果您检查 myArray,您会看到它只有 7 个元素。因此,您正尝试使用超出数组范围的下标(索引)访问 myArray,正如错误消息所告诉的那样...

从调试器中,您可以重新启动该方法并逐步执行它。但是因为它会在循环123失败,它可能很无聊......你也可以在调试器中修改代码,例如使用myArray := #(2 4 5). acceopt,然后逐步重新执行,看看你是否明白为什么算法失败。

我的建议是尝试换位思考。您已经有一个包含要打印的值的数组 (myArray)。因此,如果你设法告诉 myArray 更直接地做你想做的事,也许可以写成 myArray do: [:element | ...]

From integers 1 to 130, I want to print some specific integers already given in an array

1 to: 130 do: [ :i | 
    (array includes: i) ifTrue: [ Transcript show: i; cr. ] ]