为什么会出现以下代码:
| 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 。
答案 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
所以你没有创建临时字符串和间隔。也不是从整数到字符串的转换。