Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在smalltalk中的方法内调用self_Smalltalk - Fatal编程技术网

在smalltalk中的方法内调用self

在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

我试图在smalltalk中实现一个算术序列类,但在实现printOn方法时遇到了一些问题。 这是我的代码,由于某种原因,它在到达自我部分时会失败,但我不明白为什么

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
?真正的问题