1

我试图通过一个数组并将该数组中的字符添加到另一个对象。问题是我不断收到错误“字符实例不可索引”。但是,当我在 do 块之外运行 tag := tag,char 时,它就可以工作了。

|data startTag tag|.
data := '123456778'
startTag := false.
tag := ''.
data asArray do: [:char |
     tag := tag,char] 
4

1 回答 1

3

,定义为

Collection>>, aCollection
^self copy addAll: aCollection; yourself

这样就可以尝试对您的单个角色进行操作,就好像它是一个集合一样。这解释了错误。

对于较大的集合,您不想建立使用,,因为每次都会发生副本。因此使用流式传输协议:

|data tag|
data := '123456778'.
tag := String streamContents: [:s |
    data do: [ :char |
    s nextPut: char]]

另请查看在Collection>>do:separatedBy:数据之间添加分隔符。

[编辑] 啊,好吧,这有点像

|data tag tags state|
data := '<html>bla 12 <h1/></html>'.
state := #outside.
tags := OrderedCollection new.
tag := ''.
data do: [ :char |
    state = #outside ifTrue: [
        char = $< ifTrue: [ 
            state := #inside.
            tag := '' ]]
    ifFalse:  [ 
         char = $> ifTrue: [ 
            state := #outside.
            tags add: tag] 
        ifFalse: [ tag := tag, (char asString)]]].
tags

"an OrderedCollection('html' 'h1/' '/html')"
于 2016-02-25T20:08:00.220 回答