我是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 ]
答案 0 :(得分:4)
您的print
和printSpecial
方法都将其正文括在方括号中。你应该删除它们。尝试:
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:
)。因此,如果实际请求包含在打印它们中,那么您应该在元素中实现print
和printSpecial
。然后在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]