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

Smalltalk 将有序集合转换为文字数组,smalltalk,pharo,squeak,Smalltalk,Pharo,Squeak,我有一个有序集合,我想将其转换为文字数组。下面分别是有序集合和所需结果: 订购的收藏品1 2 3 1 2 3 实现这一点最有效的方法是什么?消息asArray将从OrderedCollection创建和排列: 这可能就是你想要的 但是,如果您说您想要一个文本数组,那么您可能正在寻找字符串“1 2 3”。在这种情况下,我将使用: ^String streamContents: [:stream | aCollection asArray storeOn: stream] 其中aColle

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

订购的收藏品1 2 3 1 2 3

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

消息asArray将从OrderedCollection创建和排列:

这可能就是你想要的

但是,如果您说您想要一个文本数组,那么您可能正在寻找字符串“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
这两个方法都使用相同的数组进行应答,其中一个使用条目1、2和3。但是,这两种实现是不同的。在方法1中,数组是在运行时动态创建的。在方法2中,数组是静态创建的,即在编译时创建的。事实上,当您接受并因此编译method2时,将创建数组并将其保存到该方法中。在Method1Instad中,没有数组,每次调用该方法时都会创建结果

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

消息asArray将从OrderedCollection创建和数组:

这可能就是你想要的

但是,如果您说您想要一个文本数组,那么您可能正在寻找字符串“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
这两个方法都使用相同的数组进行应答,其中一个使用条目1、2和3。但是,这两种实现是不同的。在方法1中,数组是在运行时动态创建的。在方法2中,数组是静态创建的,即在编译时创建的。事实上,当您接受并因此编译method2时,将创建数组并将其保存到该方法中。在Method1Instad中,没有数组,每次调用该方法时都会创建结果


因此,如果动态生成Smalltalk代码,则只需创建字符串“1 2 3”,即数组的文字表示。

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

然而,我相信您只是误解了文字数组的含义,实际上您只是在寻找一个数组

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

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

只需检查测试结果即可

#(1 2 3).
(OrderedCollection with: 1 with: 2 with: 3) asArray.
你会发现两者是相等的


[1] :有关说明,请参见此处:

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

然而,我相信您只是误解了文字数组的含义,实际上您只是在寻找一个数组

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

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

只需检查测试结果即可

#(1 2 3).
(OrderedCollection with: 1 with: 2 with: 3) asArray.
你会发现两者是相等的


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

在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的那个例子中,它没有,我得到了一个doesNotUnderstand

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


但是,正如我所说,它的预期用途是用于UISpec,而不是作为一般的持久性编译对象持久性机制。因此,我不建议将其用于这种情况。

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

它不是一种通用的机制,但主要是为了将UI规范存储在一个方法中(请参见UIBuilder)

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

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


但是,正如我所说,它的预期用途是用于UISpec,而不是作为一般的持久性编译对象持久性机制。因此,我不建议使用它。

我希望asArray是您想要的一切-我可能很好奇您为什么想要字符串,否则:@mgarciaisia是的,我刚刚意识到您所说的,并修改了我的答案。我希望asArray是您想要的一切-我可能很好奇您为什么想要字符串,否则:@mgarciaisia是的,我刚刚意识到你所说的,并修改了我的答案。@bert尽管我想知道,在编译时创建一个文本数组这一事实不是一个实现细节吗?正如所解释的,重要的是我们不能依赖文本数组来创建不同的对象。@bert尽管我想知道,在编译时创建文本数组这一事实不是一个实现细节吗?正如所解释的,重要的是我们不能依赖于文字数组来创建不同的对象。