Smalltalk 如何在do块中连接字符串?

Smalltalk 如何在do块中连接字符串?,smalltalk,gnu-smalltalk,Smalltalk,Gnu Smalltalk,我试图遍历一个数组并将该数组中的字符添加到另一个对象。问题是我一直得到一个错误“字符实例不可索引”。然而,当我运行tag:=tag时,char在do块之外,它就工作了 |data startTag tag|. data := '123456778' startTag := false. tag := ''. data asArray do: [:char | tag := tag,char] ,定义为 Collection>>, aCollection ^self co

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

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

定义为

Collection>>, aCollection
^self copy addAll: aCollection; yourself
因此,它尝试对单个角色进行操作,就像它是一个集合一样。这就是错误的原因

对于不希望使用
构建的较大集合,
,因为每次都会发生复制。因此,请使用流式传输协议:

|data tag|
data := '123456778'.
tag := String streamContents: [:s |
    data do: [ :char |
    s nextPut: char]]
还可以查看
集合>>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')"
|数据标签状态|
数据:=“bla 12”。
状态:=#外部。
标记:=OrderedCollection新建。
标签:=''。
数据do:[:char|
州=#在ifTrue之外:[
char=$ifTrue:[
状态:=#外部。
标签添加:标签]
ifFalse:[tag:=tag,(char asString)]]。
标签
“OrderedCollection('html''h1/''/html')”

谢谢,但我不确定这是否能满足我的需要。我实际上试图完成的是读取网页的html并从html中提取所有的开始标记。所以当我点击“”时,也就是当我将该字符串添加到集合并重新开始时。您确定要手动执行此操作吗?有一些工具可以做到这一点。。。(例如,在Pharo,我们有汤,一个Python的BeautifulSoup:)端口)。