如何从整数序列构造一个 String 实例?

How to construct a String instance from a sequence of integers?

我想从 Unicode 代码点创建一个测试字符串

像这样

 65 asCharacter asString,
 66 asCharacter asString,
 67 asCharacter asString,
 65 asCharacter asString,
769 asCharacter asString

String with: 65 asCharacter
       with: 66 asCharacter
       with: 67 asCharacter
       with: 65 asCharacter
       with: 769 asCharacter

这有效但是

我正在寻找一种将整数值数组转换为 class 字符串实例的方法。

#(65 66 67 65 769)

有内置方法吗? 我正在寻找这样的答案 What is the correct way to test Unicode support in a Smalltalk implementation?,但对于字符串。

用#withAll构造String实例:

String withAll: 
   (#(65 66 67 65 769) collect: [:codepoint | codepoint asCharacter])

多种方式

1. #streamContents:

如果您要处理较大的字符串,请使用流 concatenation/building,因为它速度更快。如果只是连接几个字符串,请使用更具可读性的任何内容。

String streamContents: [ :aStream |
    #(65 66 67 65 769) do: [ :each |
        aStream nextPut: each asCharacter
    ]
]

String streamContents: [ :aStream |
    aStream nextPutAll: (#(65 66 67 65 769) collect: #asCharacter)
]

2。 #withAll:

String withAll: (#(65 66 67 65 769) collect: #asCharacter)

3。 #collect:as: 字符串

#(65 66 67 65 769) collect: #asCharacter as: String

4。 #joinUsing: 字符

(#(65 66 67 65 769) collect: #asCharacter) joinUsing: ''

Note:

至少在 Pharo 中你可以使用 [ :each | each selector ],或者只是 #selector。我发现后者对于简单的事情更具可读性,但这可能是个人喜好。

这是一个 "low level" 变体:

codepoints := #(65 66 67 65 769).

string := WideString new: codepoints size.
codepoints withIndexDo: [:cp :i | string wordAt: i put: cp].
^string

请将以下内容视为非常骇人听闻、没有记录、不受支持,因此绝对是错误的做法!
你会认为你不能轻易混合字符和整数,错误你可以:

'' asWideString copyReplaceFrom: 1 to: 0 with: (#(65 66 67 65 769) as: WordArray).

的确,这是通过一个原语进行的,该原语并没有真正检查 class,只是因为接收者和参数都是 VariableWord classes...

出于同样的原因(取决于 WriteStream 实现 - 假设是脆弱的)这可以工作:

^'' asWideString writeStream
    nextPutAll: (#(65 66 67 65 769) as: WordArray);
    contents

同样适用于 ByteString 和 ByteArray。

当然,同样,我们不要忘记最复杂的方法,BitBlt:

^((BitBlt toForm: (Form new hackBits: (WideString new: 5)))
    sourceForm: (Form new hackBits: (#(65 66 67 65 769) as: WordArray));
    combinationRule: Form over;
    copyBits;
    destForm) bits

我们再次利用 WideString 的 WordArray 性质作为 Form(位图)的位容器。

希望这个答案不会得到太多的选票,它不值得!