我有一个名为' 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>>元素。
如果您需要更多代码,请不要犹豫。
答案 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