Hi Klaus,
Klaus D. Witzel wrote:
I really don't want to depend on the implementation. And in my opinion, this is not encapsulated because this is MY String, not a String created internally.
Not really. If you pass a boxed object (other than a SmallInteger) the recipient can #become: it to anything he/she likes. This is reality.
I'm not talking about security, only unconsistent side effect.
Klaus D. Witzel wrote:
What I see is that the String I give to the new Stream is modified. Then at a moment, the String does not reflect the stream anymore. This doesn't sound coherent to me.
It is not coherent because you passed an explicitly written *constant* which, in other languages, is believed to be immutable.
And if you all agree to the current behavior, then a documentation should be written: "Don't use the collection after having created a stream on it !"
Easier: don't pass constant collections to the streamers :)
It's not about constant collections at all here.
myCollection := String new: 3. myStream := WriteStream on: myCollection. myStream nextPutAll: 'abcd' copy.
Here, myCollection is left untouched which sounds normal (it's still an empty string of size 3). Now, lets replace #nextPutAll: by 4 #nextPut:
myCollection := String new: 3. myStream := WriteStream on: myCollection. myStream nextPut: $a; nextPut: $b; nextPut: $c; nextPut: $d.
This should have exactly the same behavior... however myCollection now equals 'abc' !!! Why the first 3 characters ? Why not everything or nothing at all ? This is why I think it's not coherent.
I've read the source code and I understand why it happens but I don't think it's coherent. And this as nothing to do with literals nor with immutability. This is a completely different problem (this is why I changed the thread title).