簡體   English   中英

如果Pharo Smalltalk中的語句(不返回)用於拼合列表

[英]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. ,但保留一些零空間。

請幫我!

您的代碼中有兩個語法錯誤:

  1. ifTrue:ifFalse:等的參數是block,而Smalltalk中的block是用方括號而不是括號括起來的表達式。 在你的情況下,你應該寫

     (lista at: i) isNil ifFalse: [1 to: (lista at: i "<- [ not (" 

    並與

      z:= z +1.] ]]. "<- ]] not )]." 
  2. 長行末尾缺少一個點:

     .... 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) 好吧,因為編譯器使用niltruefalse ... 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM