About Stream>>write:

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

About Stream>>write:

Damien Cassou-3
What is the desired behavior of Stream>>write:?

The implementation is:

Stream>>write:encodedObject
  ^ encodedObject putOn:self.

and there are 2 implementors of #putOn:

Object>>putOn:aStream
  ^ aStream nextPut:self.

String>>putOn:aStream
  ^ aStream nextPutAll: self.


Is there a need for such a method?

Now, if I look at some of the senders, I find:

Bitmap>>printOnStream: aStream
  aStream
     print: 'a Bitmap of length ';
     write: self size.

Color:byteEncode: aStream
  aStream
        print: '(';
        print: self class name;
        print: ' r: ';
        write: (self red roundTo: 0.001);

Rectangle>>propertyListOn: aStream
  aStream
        print:'{ x=';
        write:origin x;

In nearly all the senders, a number is passed to #write:. But if it's
a number, then #nextPut: will be sent to the stream with the number as
argument. And if you have a stream of characters, as it is the case
here because strings are printed to the stream, you can't write
numbers directly.

Try:
stream := ReadWriteStream on: String new.

Color red byteEncode: stream.
Bitmap allInstances anyOne printOnStream: stream.

it will fail on 3.7, 3.8 and 3.9.

What is the real aim of #write: and how is it different from #print:?

--
Damien Cassou