1

配列を調べて、その配列の文字を別のオブジェクトに追加しようとしています。問題は、"Instances of character are not indexable" というエラーが発生し続けることです。ただし、 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 に答える