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

时间:2016-01-25 01:10:54

标签: smalltalk pharo squeak

我有一个有序的集合,我想将其转换为文字数组。下面是有序集合和期望的结果:

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

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

4 个答案:

答案 0 :(得分:6)

消息asArray将从Array创建OrderedCollection

    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)'(即数组的文字表示)。

答案 1 :(得分:5)

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

但是,我相信你只是误解了文字数组的意思,而你实际上只是在寻找一个数组。

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

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

只需检查

的结果
#(1 2 3).
(OrderedCollection with: 1 with: 2 with: 3) asArray.

你会发现两者是平等的。

[1]:请点击此处查看解释:https://stackoverflow.com/a/29964346/1846474

答案 2 :(得分:1)

在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)

答案 3 :(得分:0)

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

它不是一般机制,但主要用于在方法中存储UI规范(参见UIBuilder)。

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

然而,添加所需的编码器/解码器并使其成为可能相对容易。

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