从 Smalltalk 中的 OrderedCollection 打印

Printing from an OrderedCollection in Smalltalk

我对 Smalltalk 还很陌生,我一直在研究如何从堆栈中打印元素。我有两个 classes,一个使用 OrderedCollection 创建堆栈,它有效,另一个 class(对象 subclass)。对于第二个 class 我有两个实例变量 name 和 weight(使用 set 和 get 方法)。我需要再制作两种方法 print 和 printSpecial。使用 get 方法 from name 将名称和体重打印输出到同一行的 Transcript,但不能使用 get 方法 from weight。 PrintSpecial 与 print 类似,但重量必须 < 100。我尝试过 print 和 printScpecial 但无法弄清楚。以下是我到目前为止所拥有的。任何帮助将不胜感激。

name: a
     name := a

name
     ^name

print
     [ Transcript
        show: weight;
        show: name;
        cr ]

printSpecial
    [ weight <= 100 ]
        whileTrue: [ Transcript
            show: weight;
            show: name;
            cr ]

您的 printprintSpecial 方法都将它们的主体括在方括号中。你应该删除它们。尝试:

print
  Transcript
    show: weight;
    show: name;
    cr

printSpecial
  weight <= 100 ifTrue: [
    Transcript
      show: weight;
      show: name;
      cr]

请注意,在 printSpecial 中,我已将 whileTrue: 替换为 ifTrue:。原因是如果 weight 恰好满足条件,您不想一直打印。

我建议的另一件事是避免重复代码。所以,我会建议:

printSpecial
  weight <= 100 ifTrue: [self print]

这样,如果您以后决定改进 print,则不必将改进复制到 printSpecial

最后,你说你有这些对象的集合。因此你应该有一些方法来枚举它们(例如,通过 do:)。因此,如果实际请求包括打印它们,您应该在元素的 class 中实现 printprintSpecial,然后在 Stack [=48] 中实现相同的消息=].

Stack >> print
  collection do: [:elem | elem print]

Stack >> printSpecial
  collection do: [:elem | elem printSpecial]

我假设保存元素的实例变量名为 collection.

更好。您可以在 Stack class 中实现 do:,然后像我上面那样使用 self do: 而不是 collection do:。类似于

Stack >> do: aBlock
  collection do: aBlock

然后

Stack >> print
  self do: [:elem | elem print]

Stack >> printSpecial
  self do: [:elem | elem printSpecial]