簡體   English   中英

Smalltalk語法錯誤

[英]Smalltalk syntax error

我現在正在學習smalltalk,並且正在嘗試制作一個非常簡單的程序,該程序創建一個數字數組,然后找到最大的數字。 我的代碼如下所示:

| list max |
list := #(1 8 4 5 3).
    1 to: list size do: [:i |
    max < (list at: i)
        ifTrue: [max := (list at: i)].
        ifFalse: [max := max].
    ].

當我運行此代碼時,出現“ stdin:7:解析錯誤,預期為']'”。 我對造成這種情況的原因有些困惑。 在我看來,所有方括號都對應。 救命?

Alexandre已經告訴過您,collection可能提供了max方法。 您可能對幾種方法感興趣。

使用collection max(所有元素的最大值)

#(1 8 4 5 3) max

使用數字最大值:(兩個數字中的較大者)

#(1 8 4 5 3) inject: 0 into: [:max :elem|
     max max: elem ]

或僅使用內部迭代器

#(1 8 4 5 3) inject: 0 into: [:max :elem|
    max < elem 
       ifTrue: [ elem ]
       ifFalse:[ max ] ]

結合使用外部迭代的解決方案,您可以看到存在很多可能性。

希望它能增加一些東西

行號似乎不對,但查看您的代碼,似乎錯誤可能是由ifTrue: [max := (list at: i)]之后的時間段引起的。 #ifTrue:ifFalse是單個方法選擇器,將其分成兩個語句沒有任何意義。

實際上,您可以完全刪除代碼的ifFalse部分。 為其自身分配max無效。 另外,這里不需要循環索引。 您可以直接使用list do: […]

max變量也應該被初始化。 零似乎是與數組中的正數進行比較的好選擇。

但是與其做所有這些事,不如研究Collection類。 您的Smalltalk方言可能已經為該任務提供了一種max方法。

您的直接問題是用一個句點終止ifTrue部分。 通常,您可以只刪除句點,但是,由於ifFalse部分實際上是不可操作的,因此最好刪除該位。

但是,即使您修復了該錯誤,您仍然需要初始化max以便不會將<消息發送到nil對象。 您可以將其初始化為第一個元素,如果有的話,則可以將循環更改為從第二個元素開始。

當然,當列表為空時,初始化到第一個元素是有問題的,因此您也應該處理該問題。 在下面的代碼中,我將其設置為適當的較小值,然后僅在可用時才從列表的第一個元素對其進行初始化。

更正后的代碼為:

| list max |
list := #(1 8 4 5 3).
max := -99999.
(list size) > 0 ifTrue: [max := (list at: 1)].
2 to: list size do: [:i |
    max < (list at: i) ifTrue: [max := (list at: i)].
]
(max) displayNl

這將按預期輸出8 ,並且在邊緣情況(列表大小為零和一)上也可以正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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