将有序集合转换为文本数组



我有一个有序集合,我想将其转换为文字数组。下面分别是有序集合和所需结果:


an OrderedCollection(1 2 3) #(1 2 3)

实现这一目标的最有效方法是什么?

asArray将从OrderedCollection创建和Array消息:

    anOrderedCollection asArray

这可能是你想要的。

但是,鉴于您说您想要一个文字数组,您可能会'#(1 2 3)'寻找字符串。在这种情况下,我会使用:

    ^String streamContents: [:stream | aCollection asArray storeOn: stream]

aCollection是你的OrderedCollection.

如果您还不熟悉streamContents:这可能是学习它的好机会。在这种情况下,它的作用等效于:

    stream := '' writeStream.
    aCollection asArray storeOn: stream.
    ^stream contents

从某种意义上说,它捕获了模式:

    stream := '' writeStream.
    <some code here>
    ^stream contents

这在Smalltalk中相当常见。

更新

如果我们澄清一下 Smalltalk 中的文字数组是什么意思,也许会有所帮助。考虑以下两种方法

method1
  ^Array with: 1 with: 2 with: 3
method2
  ^#(1 2 3)

两种方法都使用相同的数组来回答,一个数组的条目为 123 。但是,这两种实现是不同的。在method1数组是动态创建的(即在运行时)。在method2数组是静态创建的(即在编译时)。事实上,当您接受(并因此编译)method2数组并保存到方法中时。相反,在method1中,没有数组,每次调用该方法时都会创建结果。

因此,如果您动态生成 Smalltalk 代码,则只需要创建字符串'#(1 2 3)'(即数组的文字表示形式)。

不能将现有对象转换为文本数组。要获取文本数组,您必须使用源代码中的文本数组语法编写它。

但是,我相信您只是

误解了文字数组的含义,而您实际上只是在寻找数组。

文字数组只是一个数组(在 Pharo 和 Squeak [1] 中)是在编译时创建的,也就是说,当你接受该方法时。

要将有序集合转换为数组,请使用 asArray

只需检查结果

#(1 2 3).
(OrderedCollection with: 1 with: 2 with: 3) asArray.

您将看到两者是平等的。

[1]:有关解释,请参见此处: https://stackoverflow.com/a/29964346/1846474

在 Pharo 5.0(测试版)中,您可以执行以下操作:

    | oc ary |
oc := OrderedCollection new: 5.
oc addAll: #( 1 2 3 4 5).
Transcript show: oc; cr.
ary := oc asArray.
Transcript show: ary; cr.

成绩单上的输出是:

an OrderedCollection(1 2 3 4 5)
#(1 2 3 4 5)

literalArray 编码是一种"穷人"的持久性编码来获取表示,它可以从可编译的文本数组中重建对象。 即文字数组,通过使用decodeAsLiteralArray重建对象。

它不是一种通用机制,而主要是为了在方法中存储 UI 规范而发明的(请参阅 UIBuilder)。

只有一小部分类支持这种编码/解码,我不确定 OrderedCollection 是否以任何方言执行此操作。在我使用的那个(ST/X)中,它没有,我得到一个不理解。

但是,添加所需的编码器/解码器并使之成为可能相对容易。

但是,正如我所说,它的预期用途是用于 UIspecs,而不是作为一般的持久性(编译对象持久性)机制。所以我宁愿不建议使用它。

相关内容

  • 没有找到相关文章

最新更新