从 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 ]
您的 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:
)。因此,如果实际请求包括打印它们,您应该在元素的 class 中实现 print
和 printSpecial
,然后在 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]
我对 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 ]
您的 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:
)。因此,如果实际请求包括打印它们,您应该在元素的 class 中实现 print
和 printSpecial
,然后在 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]