【问题标题】:For loop for array in Pharo SmalltalkPharo Smalltalk中的数组的for循环
【发布时间】:2017-07-04 18:05:43
【问题描述】:

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

这是我的代码:

GenList
 | lista |
  lista := Array new: 31.
  1 to: 30 do: [ :i | lista at: i put: 2 atRandom - 1]
  ^lista

我能做什么?

【问题讨论】:

  • 您在第 4 行之后缺少点(语句结尾)。
  • 构造数组也没有意义......你可以这样做^ (1 to: 30) collect: [ :i | 2 atRandom - 1]

标签: oop smalltalk pharo


【解决方案1】:

需要考虑的一些有趣的事情:


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


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


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


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


3.名为listaArray 有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 没问题。然而,它迫使读者在心里做数学。一个更好的方式来表明你的意图是

#(0 1) atRandom

6.玩随机数时不要忘记保存种子


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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多