在smalltalk的方法中调用自己

Calling self inside a method in smalltalk

我想在 smalltalk 中做一个算术序列 class,我在做 printOn 方法时遇到了一些麻烦。 这是我的代码,由于某种原因它会在到达自我部分时失败,我不明白为什么

printOn: aStream
    |i retValue|
    retValue := ''.
    i := 0.
    [i < myCount ] whileTrue: [retValue := retValue + ('', self valueOf: i). i := i -1.].
    aStream nextPutAll: retValue

, 是二进制消息。它比 valueOf: 关键字消息具有更高的优先级。您实际执行的内容如下所示:

('', self) valueOf: i

你需要加上括号来明确告诉你想要 valueOf: 先执行:

'', (self valueOf: i)

其次:

你做 retValue + "probably string"。您确定要在字符串中执行 + 而不是 , 这是一个串联吗?

第三:

你从 0 开始,每一步减 i 1。你确定你不会陷入无限循环吗?

第四

为什么需要 whileTrue:?你不能做类似的事情吗:

1 to: myCount do: [ :i |
    retValue := retValue + ('', (self valueOf: i - 1)) ]

另请注意,在 Smalltalk 中,您的第一个索引是 0,最后一个索引是 myCount - 1,这很奇怪。通常您从 1 开始,以集合的大小结束。

第五次

我刚刚注意到您实际上是在将一个空字符串与 self valueOf: i 连接起来。这没有任何意义。


如果您只需要在流中打印内容,请执行以下操作:

printOn: aStream
    1 to: myCount do: [ :i |
        aStream nextPutAll: (self valueOf: i) asString) ]

printOn: aStream
    (1 to: myCount)
        do: [ :i | aStream nextPutAll: (self valueOf: i) asString) ]
        separatedBy: [ aStream nextPutAll: ', ' ]

不知道valueOf:是不是returns一个字符串,如果是就不用把asString传给结果

Smalltalk 对评估消息有严格的优先顺序。

括号 ( ) 内的表达式首先计算。
然后是一元消息(消息由一个对象后跟一条消息组成)
然后是二进制消息(消息由一个对象后跟非字母字符后跟另一个对象组成)
然后关键字消息 - 即最后评估关键字消息。 (关键字是以冒号结尾的字母串,一条关键字消息可以包含多个关键字)。
在优先级相等的情况下,表达式从左到右求值。

在您编写的表达式中,第一个元素在

中求值
  retValue + ( '', self valueOf: i) 

 ( '', self valueOf: i)

在该表达式中计算的第一个元素是

 '', self

其结果成为

的接收者
 valueOf: 1

关键字消息。

顺带一提,我会写

我 := 我 - 1

为了确保 anySmalltalk 将其正确解释为二进制表达式,而不是 i 后跟一个整数对象,-1