如何从整数序列构造一个 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(位图)的位容器。
希望这个答案不会得到太多的选票,它不值得!
我想从 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(位图)的位容器。
希望这个答案不会得到太多的选票,它不值得!