在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
我想在 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