[英]If statements(no returns) in Pharo Smalltalk for flatten list
我正在嘗試制作列表(30)的列表(30)。 我有這個:
#(#(a a a) nil nil #(b) #(c) #(d) nil nil nil #(e e) nil #(f f) nil #(g)
#(h) nil nil nil #(i i) nil nil nil #(j) nil nil nil nil nil
#(k) #(l l l)
我想做一個程序,將其轉換成這樣的列表:
#(a a a b c d e e f f g hi i j k l l l)
我的代碼是這樣的:
ToList: lista
| retorno y z |
retorno := Array new: 30.
y := 1.
(1 to: lista size)
do: [ :i |
z := 0.
(lista at: i) isNil
ifFalse:
(1 to: (lista at: i) size do: [ :j | retorno at: (y + z) put: ((lista at: i) at: j )
y:= y+1.
z:= z +1.]
)].
^retorno
我認為if語句存在一些問題,因為沒有回報。 我不知道該怎么辦,因為它在沒有y:= y+1.
,但保留一些零空間。
請幫我!
您的代碼中有兩個語法錯誤:
ifTrue:
, ifFalse:
等的參數是block,而Smalltalk中的block是用方括號而不是括號括起來的表達式。 在你的情況下,你應該寫
(lista at: i) isNil ifFalse: [1 to: (lista at: i "<- [ not ("
並與
z:= z +1.] ]]. "<- ]] not )]."
長行末尾缺少一個點:
.... put: ((lista at: i) at: j) "<- dot missing" y:= y+1. z:= z +1.
修復了這兩個問題之后,您應該能夠運行代碼以查看其是否按預期工作(或者如果不行則進行調試。)但這是另一回事了……
附錄
這里也有可疑之處。
在Smalltalk中,我們使用單引號來分隔文字字符串( 'Hello world'
)和文字字符前面的美元符號,例如$a
。
此外,我們還有文字數組,它們由其他文字組成,並包含在#(
和)
之間,如#('a' $a)
。
現在,在您的代碼中,您編寫了諸如#(aaa)
表達式,這些表達式與我們剛剛看到的格式不符。 那么這是什么意思? 更准確地說,Smalltalk編譯器將如何解釋這種表示法? 答案是它將假設您的意思是:
#(#a #a #a)
即,陣列Symbols
,而且你不想寫那么多#
秒。 因此,在練習中,您應該考慮自己實際上是想要字符#($a $a $a)
,字符串#('a' 'a' 'a')
#(#a #a #a)
#('a' 'a' 'a')
還是符號#(#a #a #a)
。
其他字符串也是如此。 例如, #(abc de)
將被編譯為#(#abc #de)
...
嗯
等一下 如果是這樣,為什么#(#(aaa) nil)
不會被編譯為#(#(aaa) #nil)
? 好吧,因為編譯器使用nil
, true
和false
... uff產生了異常!
還要注意,在Smalltalk的某些方言中,編譯器會將#((aaa))
解釋為#(#(aaa))
因此您不必鍵入那么多的磅符號...
總結一下 。 如果選擇將一些磅數保存在文字數組中,請保持一致並寫入#((aaa))
而不是#(#(aaa))
。 否則,請完全完成並編寫#(#(#a #a #a))
。
您可以將其編寫為:
flattenArray: anArray
| ws |
ws = WriteStream on: (Array new).
anArray do: [:subArr| :
subArr notNil ifTrue: [
subArr do: [ :el | ws nextPut: el ]]].
^ws contents.
有2條一般性說明,很少需要按索引訪問集合元素,如果要這樣做,請停止並考慮是否有更多可用的優雅方法。 當您要收集一系列結果時,第二個WriteStreams很方便。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.