在smalltalk中调用一个方法中的self

时间:2016-04-04 21:05:06

标签: smalltalk

我正在尝试在smalltalk中执行算术序列类,我在执行printOn方法时遇到了一些麻烦。 这是我的代码,由于某种原因,它会失败到达自我部分,我不明白为什么虽然

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

2 个答案:

答案 0 :(得分:10)

,是二进制消息。它的优先级高于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:是否返回字符串,如果是,则无需向结果发送asString

答案 1 :(得分:6)

Smalltalk有一个严格的优先顺序来评估消息。

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

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

中计算
  retValue + ( '', self valueOf: i) 

 ( '', self valueOf: i)

在该表达式中评估的第一个元素是

 '', self

然后它的结果成为

的接收者
 valueOf: 1

关键字消息。

顺便说一下,我会写

i:= i - 1

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