在SmallTalk中为堆栈创建Print方法

时间:2014-10-03 20:14:22

标签: smalltalk pharo

我有一个名为' AStack'

的课程
Object subclass: #AStack
    instanceVariableNames: 'elements'
...

它包含一个OrderedCollection对象,用于保存它的元素对象'

initialize 
super initialize.
elements := OrderedCollection new

它的成员类分别推送和弹出:

push: anObject 
self elements addFirst: anObject 

pop
^self elements removeFirst 

我正在尝试编写一个print方法,该方法使用timesRepeat打印堆栈的内容并同时清空它。它为每个元素调用子类打印方法' (打印^自我名称)并使用' Transcript'

在屏幕上输出
print
self size timesRepeat: [ Transcript show: elements print. self pop ]

工作区代码:

| o1 o2 stk |

o1 := Object new.
o1 name: 'object1'.

o2 := Object new.
o2 name: 'object2'.

stk := AStack new.
stk push: o1.
stk push: o2.

stk print.

运行上面的代码后,我在Pharo中收到一条错误消息: MessageNotUnderstood:AStack>>元素

如果您需要更多代码,请不要犹豫。

3 个答案:

答案 0 :(得分:2)

据我所知,stk push: o1.发生错误,因为#push:使用了self elements,可能您在 AStack中没有#elements方法

另外,对于清空堆栈,不使用self size timesRepeat:[ self notEmpty ] whileTrue: [ … ][ self isEmpty ] whileFalse: [ … ]等其他变体更合乎逻辑。它使代码更容易理解。

当我们谈论可理解性时,通常人们不会期望#print方法会破坏他们的集合:)

答案 1 :(得分:0)

在smalltalk中,所有实例变量都是严格私有的。它意味着:对象不会理解消息'元素'除非你明确定义了访问者。

在您的情况下,如果您不想公开'元素'通过访问者,您可以将所有self elements替换为elements

另外,我没有在任何地方看到size。所以定义应该如下:

AStack>>size
    ^elements size

答案 2 :(得分:0)

npm install s3-sync