gpt4 book ai didi

smalltalk - 子类流

转载 作者:行者123 更新时间:2023-12-02 15:28:12 24 4
gpt4 key购买 nike

我有兴趣创建我自己的 Stream 子类,我想知道我应该覆盖哪些方法(部署在 pharo 和 Gemstone 上)。我有一个集合,里面有各种类型的东西,我希望能够流过它的一个子集,包含一个类的元素。我不想复制集合或使用 collect: block ,因为集合可能很大。我的第一个用例是这样的:

stream := self mailBox streamOf: QTurnMessage.
stream size > 1
ifTrue: [ ^ stream at: 2 ]
ifFalse: [ ^ nil ]

关于要覆盖哪些方法的任何指示?

最佳答案

在 Smalltalk 中,当我们说 Stream我们指的是响应由一些方法给出的基本协议(protocol)的对象,例如#next、#nextPut:、#contents 等。因此,在进一步详细介绍之前,我会说 stream at: 2 ,正如您在示例中所说,不是一个非常合适的表达方式。 Stream 的更合适的表达式会是

stream position: 2.
^stream next

因此,您首先要考虑的是您是否正在寻找 StreamCollection .这个基本决定取决于您的对象必须实现的行为。

使用 Stream 的子类如果您决定要使用#next 枚举元素,即主要按顺序排列。但是,如果您想通过 at: index 访问您的元素, 使用 SequenceableCollection. 的子类为您的对象建模

如果您选择流,则必须决定是只访问它们进行读取操作还是还想修改它们的内容。您对问题的描述似乎表明您只会阅读它们。因此,您必须首先实现的基本协议(protocol)是

#next "retrieve the object at the following position and advance the position"
#atEnd "answer with true if there are no more objects left"
#position "answer the current position of the implicit index"
#position: "change the implicit index to a new value"

此外,如果您的流是只读的,请将您的类设为 ReadStream 的子类。 .

如果您想继承更高级的方法,您还必须实现一些其他的附加消息。一个例子是 #next:它检索几个连续元素的子集合(它的大小由参数给出。)

如果您认为将对象建模为集合会更好,那么您必须实现的基本协议(protocol)包括以下三个方法

#at: index "retrieve the element at the given index"
#size "retrieve the total number of elements"
#do: aBlock "evaluate aBlock for every element of the receiver"

(我不认为你的收藏必须支持 at:put:. )

最近我们遇到了您所描述的相同问题,并决定将我们的对象建模为集合(而不是流)。但是,无论您最终采用哪种方法,我认为您都应该尝试两种方法,看看哪种更好.没有人会比您的 Smalltalk 系统给您更好的建议。

顺便说一句,还请注意,如果您有一个(可排序的)Collection , 你会得到一个 Stream免费:只需发送 #readStream到你的收藏!

关于smalltalk - 子类流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29320673/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com