在smalltalk中的方法内调用self
我试图在smalltalk中实现一个算术序列类,但在实现printOn方法时遇到了一些问题。 这是我的代码,由于某种原因,它在到达自我部分时会失败,但我不明白为什么在smalltalk中的方法内调用self,smalltalk,Smalltalk,我试图在smalltalk中实现一个算术序列类,但在实现printOn方法时遇到了一些问题。 这是我的代码,由于某种原因,它在到达自我部分时会失败,但我不明白为什么 printOn: aStream |i retValue| retValue := ''. i := 0. [i < myCount ] whileTrue: [retValue := retValue + ('', self valueOf: i). i := i -1.]. aStr
printOn: aStream
|i retValue|
retValue := ''.
i := 0.
[i < myCount ] whileTrue: [retValue := retValue + ('', self valueOf: i). i := i -1.].
aStream nextPutAll: retValue
printOn:aStream
|我重新估价|
retValue:=''。
i:=0。
[i
,
是一条二进制消息。它的优先级高于:关键字消息的值。您实际执行的操作如下所示:
('', self) valueOf: i
您需要加上括号,明确表示希望先执行valueOf:
:
'', (self valueOf: i)
第二:
您可以retValue+“可能是字符串”
。您确定要在字符串中执行+
,而不是,
,这是一种串联吗
第三:
从0开始,每一步将i
减少1。您确定不会以无限循环结束吗
第四
为什么您需要,而实际情况是:
?你不能做一些像:
1 to: myCount do: [ :i |
retValue := retValue + ('', (self valueOf: i - 1)) ]
printOn: aStream
1 to: myCount do: [ :i |
aStream nextPutAll: (self valueOf: i) asString) ]
另外请注意,在Smalltalk中,第一个索引是0,最后一个是myCount-1,这很奇怪。通常以1开始,以集合的大小结束
第五
我刚刚注意到,实际上是将一个空字符串与self-valueOf:I
连接起来。这没有任何意义
如果您只需要在流上打印内容,请执行以下操作:
1 to: myCount do: [ :i |
retValue := retValue + ('', (self valueOf: i - 1)) ]
printOn: aStream
1 to: myCount do: [ :i |
aStream nextPutAll: (self valueOf: i) asString) ]
或
我不知道valueOf:
是否返回字符串,如果返回,则无需向结果发送asString
Smalltalk对消息的评估具有严格的优先顺序
首先计算括号()内的表达式。
然后是一元消息(由一个对象后跟一条消息组成的消息)
然后是二进制消息(由一个对象后跟另一个对象的非字母字符组成的消息)
然后,关键字消息-即,最后评估关键字消息。(关键字是以冒号结尾的字母字符串,关键字消息可以包含多个关键字)。
当优先级相等时,表达式从左到右求值
在您编写的表达式中,第一个元素在
retValue + ( '', self valueOf: i)
是
在该表达式中计算的第一个元素是
'', self
然后,该结果将成为数据的接收者
valueOf: 1
关键词消息
顺便说一句,我会写
i:=i-1
为了确保任何Smalltalk都能正确地将其解释为二进制表达式,而不是后面跟着一个整数对象,-1非常感谢!我是smalltalk的新手,很高兴看到这里有一个社区。关于第二点——如何做到?第三,你说得对。第四,我从一个for循环开始,我想用一个while循环可能会成功。第五,我不明白,想解释一下吗?在解决这个问题的案例中,我如何在?@infeted 2的值之间添加一个逗号:您可以对数字集合使用+
:#(2 3 5)+2=#(4 5 7)
。如果您有'foo'
和'bar
,并且想要获得'foobar'
,您需要使用,
消息。5:'ab','cd'='a','bcd'='','abcd'='abcd'
。您正在将空字符串与某些内容连接起来。无论开始时有多少空字符串,结果都将是您拥有的非空字符串。我添加了另一个例子,是否真的有任何Smalltalk方言将I-1
解析为“变量I
和数字-1
?真正的问题