如何从Smalltalk中的OrderedCollection打印对象数据

cad*_*ebe 4 loops smalltalk

我在Smalltalk中有一个类,它存储OrderedCollection对象.每个对象都有一个名称.我想迭代OrderedCollection对象并打印出每个对象的名称.例如,在Java中我会有类似的东西:

for(int i = 0; i < array.length; ++i) {
  System.out.println(array[i].getName());
}
Run Code Online (Sandbox Code Playgroud)

这是我在Smalltalk中得到的,其中"list"是OrderedCollection:

1 to: list size do: [
:x | Transcript show: 'The object name:' list at: x printString; cr.
]
Run Code Online (Sandbox Code Playgroud)

Lea*_*lia 9

您的解决方案很好,除了两个小错误:(1)您忘记了一些括号,(2)连接消息#,丢失:

1 to: list size do: [
   :x | Transcript show: 'The object name:' list at: x printString; cr.
]
Run Code Online (Sandbox Code Playgroud)

本来应该

1 to: list size do: [
   :x | Transcript show: 'The object name:' , (list at: x) printString; cr.
]
Run Code Online (Sandbox Code Playgroud)

否则Transcript对象将收到#show:at:它不理解的消息.此外,您必须将字符串连接'The object name: '起来(list at: x) printString,这就是您需要#,在其间使用连接消息的原因.

但请注意,在您的示例中,不需要使用索引.而不是迭代1list size你可以简单地枚举list集合中的对象,如下所示:

list do: [:object | Transcript show: 'The object name: ' , object printString; cr]
Run Code Online (Sandbox Code Playgroud)

此表单通常是首选,因为它避免使用中间索引(x在您的示例中)并强制您x-使用集合访问集合的元素#at:,所有这些都使您的代码更易于阅读和修改.

  • +1,虽然我还要补充说,在Smalltalk中非常典型的迭代变量被称为"each",或者称为"everySomething",以强调其迭代性质,并且我们正在为_each_值做一些事情.名单.为了更加迂腐,我会尽量不要调用你的集合`list`,因为它将你绑定到某个集合实现.(如果你以后需要它成为'Set`怎么办?)相反,我建议OP使用复数名词,比如说`accounts`,或`objects`,或者你的域中适用的任何名词. (3认同)
  • 好点@ AmosM.Carpenter.像`list`,`collection`等通用名称只适用于上下文使其含义明显的情况(例如,Pharo中`PositionableStream`的ivar`集合.)否则更倾向于使用特定名词对于分类包含的元素.由于这个原因,我通常不会将`each`用于通用枚举变量,而是说`accounts do:[:account | <嗒嗒>]`.无论如何,帮助人们学习民俗习俗总是有价值的. (2认同)
  • 充分利用这两个世界,并使用`accounts do:[:eachAccount | <嗒嗒>]`.永远不要伤害要明确,如果有人看到嵌套了几层深层的代码,而不必查看上下文,他们一眼就会知道`eachAccount`是迭代变量,而` account`可以是实例变量或临时变量.这个惯例是有充分理由的.:-) (2认同)