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

Ani*_*ing 1 smalltalk squeak pharo

我有一个有序的集合,我想将其转换为文字数组.以下是有序集合和所需结果:

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

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

Lea*_*lia 6

该消息asArray将创建并ArrayOrderedCollection:

    anOrderedCollection asArray
Run Code Online (Sandbox Code Playgroud)

这可能就是你想要的.

但是,如果你说你想要一个文字数组,你可能会发现你正在寻找字符串'#(1 2 3)'.在那种情况下,我会使用:

    ^String streamContents: [:stream | aCollection asArray storeOn: stream]
Run Code Online (Sandbox Code Playgroud)

这里aCollection是你的OrderedCollection.

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

    stream := '' writeStream.
    aCollection asArray storeOn: stream.
    ^stream contents
Run Code Online (Sandbox Code Playgroud)

从它捕获模式的意义上说:

    stream := '' writeStream.
    <some code here>
    ^stream contents
Run Code Online (Sandbox Code Playgroud)

这在Smalltalk中很常见.

UPDATE

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

method1
  ^Array with: 1 with: 2 with: 3

method2
  ^#(1 2 3)
Run Code Online (Sandbox Code Playgroud)

这两种方法都回答以相同的阵列中,用一个条目1,23.但是,这两种实现方式不同.在method1数组中动态创建(即在运行时).在method2数组中静态创建(即,在编译时).实际上,当您接受(并因此编译)时method2,将创建数组并将其保存到方法中.在method1代替,不存在阵列和结果创建的每个被调用的方法的时间.

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


eMB*_*Bee 5

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

但是,我相信你只是误解了文字数组意味着什么,而你实际上只是在寻找一个数组.

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

将有序集合转换为您使用的数组asArray.

只是检查结果

#(1 2 3).
(OrderedCollection with: 1 with: 2 with: 3) asArray.
Run Code Online (Sandbox Code Playgroud)

你会发现两者是平等的.

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