从Smalltalk中的OrderedCollection打印

时间:2016-10-17 17:22:09

标签: smalltalk

我是Smalltalk的新手,我一直坚持如何从堆栈中打印元素。我有两个类,一个使用OrderedCollection创建堆栈,一个工作,另一个类(Object子类)。对于第二个类,我有两个实例变量name和weight(使用set和get方法)。我需要再制作两个方法print和printSpecial。使用名称中的get方法将名称和权重输出到同一行的Transcript,但不能使用权重的get方法。 PrintSpecial类似于print,但重量必须<&lt; 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 ]

1 个答案:

答案 0 :(得分:4)

您的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:)。因此,如果实际请求包含在打印它们中,那么您应该在元素中实现printprintSpecial。然后在Stack类中实现相同的消息。

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

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

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

更好。您可以在do:课程中实施Stack,然后像上面一样使用self do:代替collection do:

的内容
Stack >> do: aBlock
  collection do: aBlock

然后

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

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