Colin Putney wrote:
> This is a bit like the #join: debate that comes up every now and then > when a Ruby/Python/Perl ex-pat asks how it is that we don't have a > method for joining an array of strings into a single string. The short > answer is that it's because #join: only makes sense when all the > elements of a collection are strings, and therefore, it's bad design. I have to disagree. Have you ever looked at the senders of do:separatedBy: (which is the easiest way to find lots the places that would be improved by join)? For example: ClassDscription>>instanceVariablesString "Answer a string of my instance variable names separated by spaces." ^String streamContents: [ :stream | self instVarNames do: [ :each | stream nextPutAll: each ] separatedBy: [ stream space ] ] Why should code like this be duplicated throughout the system? If the requirement is that join: is only to join strings (which is fine with me) then convert the input to strings! It's simple, see: SequenceableCollection>>join: delimiter "Join the elements of the receiver using the given delimiter" ^String streamContents:[:s| self do:[:each| s nextPutAll: each asString] separatedBy:[s nextPutAll: delimiter asString]]. and the first example becomes: ClassDescription>>instanceVariablesString "Answer a string of my instance variable names separated by spaces." ^self instVarNames join: ' ' This is a muchly improved version as far as I am concerned. > This is similar. I'd say the best way to improve #sum would be to delete > it. It is indeed similar. In such that Collection>>sum is just as useful a utility that should be supported as well. I see no problem in requiring that #sum is only valid for non-empty input and the result is undefined (returning, nil, 0, or an error) if used on an empty collection. Cheers, - Andreas |
On Tue, Aug 12, 2008 at 6:39 PM, Andreas Raab <[hidden email]> wrote:
> Colin Putney wrote: >> >> This is a bit like the #join: debate that comes up every now and then >> when a Ruby/Python/Perl ex-pat asks how it is that we don't have a method >> for joining an array of strings into a single string. The short answer is >> that it's because #join: only makes sense when all the elements of a >> collection are strings, and therefore, it's bad design. > > I have to disagree. Have you ever looked at the senders of do:separatedBy: > (which is the easiest way to find lots the places that would be improved by > join)? For example: > > ClassDscription>>instanceVariablesString > "Answer a string of my instance variable names separated by spaces." > ^String streamContents: [ :stream | > self instVarNames > do: [ :each | stream nextPutAll: each ] > separatedBy: [ stream space ] ] > > Why should code like this be duplicated throughout the system? If the > requirement is that join: is only to join strings (which is fine with me) > then convert the input to strings! It's simple, see: > > SequenceableCollection>>join: delimiter > "Join the elements of the receiver using the given delimiter" > ^String streamContents:[:s| > self do:[:each| s nextPutAll: each asString] > separatedBy:[s nextPutAll: delimiter asString]]. > > and the first example becomes: > > ClassDescription>>instanceVariablesString > "Answer a string of my instance variable names separated by spaces." > ^self instVarNames join: ' ' > > This is a muchly improved version as far as I am concerned. > >> This is similar. I'd say the best way to improve #sum would be to delete >> it. > > It is indeed similar. In such that Collection>>sum is just as useful a > utility that should be supported as well. I see no problem in requiring that > #sum is only valid for non-empty input and the result is undefined > (returning, nil, 0, or an error) if used on an empty collection. > > Cheers, > - Andreas +1. And there is already a join implementation out there (by Keith I think) that does double dispatch so that the result will be sensible depending on what was actually joined. |
Free forum by Nabble | Edit this page |