Smalltalk Pharo字符串连接而不是流

时间:2016-11-04 15:24:50

标签: 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

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

  

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

我做的事情可以通过溪流轻松完成吗?我想要实现的是创建所有值 a1 a9 b1 列表 b9 c1 c9

2 个答案:

答案 0 :(得分: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

(如果您不需要Heap,您可以直接返回第三行,而不是list tempvar。

答案 1 :(得分:1)

要最小化创建的对象的数量,您可以这样做:

| list types digits |

list := Heap new.
types := #($a $b $c).
digits := (1 to: 9) collect: #asCharacterDigit.

types do: [ :t | 
    digits do: [ :d |
        list 
            add: ((String new: 2)
                at: 1 put: t;
                at: 2 put: d;
                yourself)
          ] ].
^ list

所以你没有创建临时字符串和间隔。也不是从整数到字符串的转换。