对于Pharo Smalltalk中的阵列循环

Dia*_*ala 4 oop smalltalk pharo

我正在尝试使用随机数(只有0或1)创建一个数组,但是当我运行它时,它只是打印出来:遇到语句列表的结尾 - >

这是我的代码:

GenList
 | lista |
  lista := Array new: 31.
  1 to: 30 do: [ :i | lista at: i put: 2 atRandom - 1]
  ^lista
Run Code Online (Sandbox Code Playgroud)

我能做什么?

Lea*_*lia 12

一些有趣的事情要考虑:


1.方法选择器不以小写字母开头


选择器以小写字母开头是一种传统.从这个意义上讲,genLista会更加正确GenLista.


方法选择器包含缩写词'gen'.


例如,genLista可以重命名为genereListao listaAlAzar(如果您决定使用西班牙语)


3. Array命名lista有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
Run Code Online (Sandbox Code Playgroud)

因为没有指示两个句子之间分隔的点,所以不会编译.请注意,错误发生在编译时(即,当您保存方法时),因为返回令牌^必须启动一个语句(即,它不能在语句中内联).

在其他情况下,丢失的点不会阻止代码编译.相反,错误将在运行时发生.这是一个(典型的)例子:

1 to: 10 do: [:i | self somethingWith: i]     "<- missing dot here"
self somethingElse
Run Code Online (Sandbox Code Playgroud)

丢失的点将生成运行时错误self not understood by block.


5.有一种更有表现力的方法可以随机生成0和1


计算没问题2 atRandom - 1.然而,它迫使读者在精神上做数学.揭示你的意图的更好方法就是

#(0 1) atRandom
Run Code Online (Sandbox Code Playgroud)

6.使用随机数时,不要忘记保存种子


虽然可以使用atRandom,但这种做法只能与"玩具"代码一起使用.如果您正在开发系统或库,建议的做法是在生成任何随机数据之前将种子保存在某处.这将允许您稍后重现随机数量的生成,以便进行调试或确认.(但请注意,这不足以使您的程序具有确定性的可重现性,因为无序(例如散列)集合在连续执行中可能会有不同的形式.)