[英]For loop for array in Pharo Smalltalk
我正在嘗試使用隨機數(只有0或1)創建一個數組,但是當我運行它時,它只是打印出來:遇到語句列表的結尾 - >
這是我的代碼:
GenList
| lista |
lista := Array new: 31.
1 to: 30 do: [ :i | lista at: i put: 2 atRandom - 1]
^lista
我能做什么?
1.方法選擇器不以小寫字母開頭
選擇器以小寫字母開頭是一種傳統。 從這個意義上說, genLista
比GenLista
更正確。
方法選擇器包含縮寫詞'gen'。
例如, genLista
可以重命名為genereLista
o listaAlAzar
(如果您決定使用西班牙語)
3.名為lista
的Array
有31個元素,而不是30個元素
Array new: 31
的結果是31個元素的數組。 但是,它下面的代碼只填充其中的30個,留下最后一個未初始化(即, nil
)。 可能的解決方案: lista := Array new: 30
。
4.缺少一個點導致編譯錯誤
編碼
1 to: 30 do: [ :i | lista at: i put: 2 atRandom - 1]
^lista
因為沒有指示兩個句子之間分隔的點,所以不會編譯。 請注意,錯誤發生在編譯時(即,當您保存方法時),因為返回標記^
必須啟動一個語句(即,它不能在語句中內聯)。
在其他情況下,丟失的點不會阻止代碼編譯。 相反,錯誤將在運行時發生。 這是一個(典型的)例子:
1 to: 10 do: [:i | self somethingWith: i] "<- missing dot here"
self somethingElse
丟失的點將生成運行時錯誤, self not understood by block
。
5.有一種更有表現力的方法可以隨機生成0和1
2 atRandom - 1
的計算2 atRandom - 1
是可以的。 然而,它迫使讀者在精神上做數學。 揭示你的意圖的更好方法就是
#(0 1) atRandom
6.使用隨機數時,不要忘記保存種子
雖然可以使用atRandom
,但這種做法只能與“玩具”代碼一起使用。 如果您正在開發系統或庫,建議的做法是在生成任何隨機數據之前將種子保存在某處。 這將允許您稍后重現隨機數量的生成,以便進行調試或確認。 (但請注意,這不足以使您的程序具有確定性的可重現性,因為無序(例如散列)集合在連續執行中可能會有不同的形式。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.