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. ] ]
我想要的是: 从整数 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. ] ]