Smalltalk - 是否可以通过方法将字符串添加到String实例?
基本上我喜欢以下内容:
renderThisOn: aString
aString append: 'whatever text I want'
基本上我喜欢String实例(ByteString等)的行为就像" html"在海边的对象。我把它作为一个参数传递给多个方法,每个方法都向它添加一些信息。
答案 0 :(得分:5)
从实际角度来看,答案是否定的,不可能改变String的大小。您可以修改字符串的字符:
a := 'abc'.
a at: 2 put: $x.
a = 'axc' "true"
因此,当您连接两个字符串时,您将获得第三个字符串,而其他两个字符串保持不变
s := 'abc'.
t := 'def'.
u := s , t.
s = 'abc'. "true"
t = 'def'. "true"
说到这里,实际上有一种方法可以增长(或收缩)一个String。我们的想法是使用become:
(或becomeForward:
)。此消息将使用对参数的引用替换对接收方的所有引用。在你的情况下:
s := 'abc'.
t := 'def'.
assoc := s -> 3 "referene to s"
s become: s , t.
s = 'abcdef'. "true"
assoc key == s "true"
我开始回答的原因是你说不能改变字符串的大小是因为在绝大多数情况下使用become:
是过度的,建议的做法是检查代码并且不需要修改对象的结构。
答案 1 :(得分:3)
Smalltalk中的字符串文字是不可变对象。
可能有不同的方式:
传递WriteStream的实例
renderThisOn: aWriteStream
aWriteStream nextPutAll: 'whatever text I want'
您可以在String周围创建自己的类包装器并传递其实例:
renderThisOn: aStringWrapper
aStringWrapper append: 'whatever text I want'
更优选流,因为流比字符串连接更快
答案 2 :(得分:1)
逗号方法:
|a|
a := 'abc'.
a,'def'
ctrl+p
并获取'abcdef'
答案 3 :(得分:0)
根据您的使用方式,字符串固定器可以满足您的需求。最简单的可能是传递一个数组,第一个也是唯一一个元素是你想要在不同方法中改变的字符串。数组不会发生变化,但是当你在那里放置不同的字符串时,唯一的元素会发生变化。更复杂的是创建一个专门的字符串持有者类,其中一个字段包含更改的字符串。然后,您可以在该持有者上实现常用字符串方法,以重定向到当前实际字符串。