如何在没有副本的情况下向后传输集合?

时间:2015-03-21 00:23:41

标签: smalltalk pharo squeak

我想知道如何在Pharo / Squeak中向后传输集合而无需复制

例如,要转发#(1 2 3)以便stream next返回3,然后2,然后1。我知道我可以使用collection reversed readStream,但reversed份。

3 个答案:

答案 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)

我头顶有三个选项:

  1. 修改您的代码以使用#reverseDo:
  2. 使用Xtreams
  3. 滚动您自己的信息流