> On 12 Oct 2015, at 14:26, Esteban Lorenzano <[email protected]> wrote:
> 
> Hi, 
> 
> I just spotted this:
> 
> 
> Integer>>#putOn: aStream
> 
>       (aStream isBinary ifTrue: [ self asByteArray ] ifFalse: [ self 
> asString]) putOn: aStream

IMO, this is not good, implicit (and inefficient) conversions are being done. 
Why ?

What is the exact contract of #putOn: anyway ?

If the result should really depend on the argument, double dispatch might be 
better.

> It does not look so bad at the begining, but… if I do: 
> 
> ByteArray streamContents: [ :s | 42 putOn: s ]
> 
> I got an infinite loop.
> 
> I know, it does not look as a very typical case, but… if I’m writing to a 
> Socket and I want to use 
> 
> mySocket << 255 “IAC”, that’s exactly what will happen :(
> 
> If I redefine it as: 
> 
> Integer>>#putOn: aStream
>       aStream isBinary ifFalse: [ 
>               self asString putOn: aStream.
>               ^ self ].
>       self asByteArray do: [ :each | aStream nextPut: each ]
> 
> then is ok… 
> 
> Would that be a good change?

Yeah that looks about right, still weird, but no weirder than before ;-)

> Esteban


Reply via email to