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

Inf*_*ted 3 smalltalk

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

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

Uko*_*Uko 10

,是一个二进制消息.它的优先级高于valueOf:关键字消息.你实际执行的是这样的:

('', self) valueOf: i
Run Code Online (Sandbox Code Playgroud)

你需要使用括号明确告诉你valueOf:要先执行:

'', (self valueOf: i)
Run Code Online (Sandbox Code Playgroud)

其次:

你呢retValue + "probably string".你确定要用+字符串做,而不是,连接吗?

第三:

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

第四

你为什么需要whileTrue:?你做不到这样的事情:

1 to: myCount do: [ :i |
    retValue := retValue + ('', (self valueOf: i - 1)) ]
Run Code Online (Sandbox Code Playgroud)

还请注意,在Smalltalk中你的第一个索引是0并且最后一个是myCount是奇怪的.1.通常你从1开始并以集合的大小结束.

第五

我刚刚注意到你实际上正在连接一个空字符串self valueOf: i.这没有任何意义.


如果你只需要在流上打印东西,请执行以下操作:

printOn: aStream
    1 to: myCount do: [ :i |
        aStream nextPutAll: (self valueOf: i) asString) ]
Run Code Online (Sandbox Code Playgroud)

要么

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

我不知道是否valueOf:返回一个字符串,如果是,则不需要发送asString给结果


Eua*_*n M 6

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

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

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

  retValue + ( '', self valueOf: i) 
Run Code Online (Sandbox Code Playgroud)

 ( '', self valueOf: i)
Run Code Online (Sandbox Code Playgroud)

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

 '', self
Run Code Online (Sandbox Code Playgroud)

结果然后成为接收者

 valueOf: 1
Run Code Online (Sandbox Code Playgroud)

关键字消息.

顺便说一下,我会写

我:=我 - 1

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