我想知道如何在Pharo / Squeak中向后传输集合而无需复制。
例如,要转发#(1 2 3)
以便stream next
返回3
,然后2
,然后1
。我知道我可以使用collection reversed readStream
,但reversed
份。
答案 0 :(得分:3)
使用一个实例变量RevertingCollection
创建SequeanceableCollection
类作为collection
的子类。现在定义这三个方法(实例方面):
on: aCollection
collection := aCollection
size
^collection size
at: index
^collection at: self size - index + 1
完成。您现在可以执行以下操作:
stream := (RevertingCollection new on: #(1 2 3)) readStream.
你会得到
stream next "3".
stream next "2".
stream next "1"
您可以更进一步实施消息
SequenceableCollection >> #reverseStream
^(RevertingCollection new on: self) readStream
通过这种方式,一切都变为
#(1 2 3) reverseStream
<强>附录强>
正如评论中所讨论的,这里缺少两个部分:
<强> 1。实例创建方法(类侧)
RevertingCollection class >> #on: aCollection
^self new on: aCollection
通过此添加,上述方法应重写为:
SequenceableCollection >> #reverseStream
^(RevertingCollection on: self) readStream
注意:其他小公司希望将此方法命名为#withAll:
。
<强> 2。以下复制方法:
RevertingCollection >> #copyFrom: start to: stop
| n |
n := self size.
copy := collection copyFrom: n - stop + 1 to: n - start + 1.
^self class on: copy
此方法需要在反向读取流中支持#next:
。
答案 1 :(得分:3)
您可以使用生成器:
| coll stream |
coll := #(1 2 3).
stream := Generator on: [:g | coll reverseDo: [:ea | g yield: ea]].
stream next
生成器允许您基本上围绕任何代码包装流式界面。
答案 2 :(得分:2)
我头顶有三个选项:
#reverseDo: