Smalltalk Pharo字符串连接而不是流

Adr*_*ete 4 smalltalk pharo

为什么会有以下代码:

| list types |
list := Heap new.
types := #('a' 'b' 'c').
types do:[ :t |
    1 to:9 do:[ :i |
        list add:(t, i asString).
        ].
    ].
^ list
Run Code Online (Sandbox Code Playgroud)

String concatenation instead of streams在Pharo的方法中发出警告?点击[ ]按钮显示:

字符串连接而不是流
在某些迭代消息中使用字符串连接检查代码.

我是否正在做一些可以通过流更容易完成的事情?我想实现的是创建一个列表的所有值的A1A9,B1B9C1C9.

Pet*_*nak 8

它抱怨因为t, i asString集合循环中的部分(您可以查看类中规则的实际实现)RBStringConcatenationRule.

通常不鼓励字符串连接,因为它更慢且内存更紧密(IIRC关于内存).

因此,如果您正在进行一些繁重的连接(将大量部分连接到单个字符串中),则最好使用流:您可以查看系统中的大多数printOn:方法以查看它的实际运行情况.

然而,在琐碎的情况下,串联,很好,警告规则太宽泛了.警告只是......警告某些事情可能是错误的,或者某些事情可能写得更好.

说到更好的写作中,在Smalltalk最好是使用专门的收集方法(select:,collect:在过于通用,...) do:,如

| list types |
types := #('a' 'b' 'c').
list := types flatCollect: [ :t | (1 to: 9) collect: [ :i | t , i asString ].
^ Heap withAll: list
Run Code Online (Sandbox Code Playgroud)

(如果你不需要,Heap你可以直接返回第三行而不是listtempvar.