From: Eric Mahurin Date: 2005-05-23T06:27:10+09:00 Subject: Re: join not in Enumerable --- "David A. Black" wrote: > Hi -- > > On Sun, 22 May 2005, Eric Mahurin wrote: > > > --- "David A. Black" wrote: > >> I have to say, though, that I think #each_with_index > should > >> be removed > >> from Enumerable and pushed down to the classes that mix it > in > >> (similarly to #each_index). But I suppose as long as they > >> are called > >> "enumerable" they are in some sense associated with a > >> numerical index. > > > > Unfortunately for Hash, this can cause confusion to what an > > "index" is. If it weren't for an already existing > Hash#index > > (which gets a key), I would suggest it be brought over from > > Array to Enumerable. > > I see it the other way. "Index" means different things to > different > enumerables. I don't like the idea of having Enumerable > define index > as consecutive integers slapped onto the elements. I'd > rather defer > that to the classes -- as, indeed, it is, with the strange > exception > of each_with_index. I was agreeing with you - each_with_index confuses what an "index" is for Hash (or Hash#index does depending on how you look at it). > > I do tend to think that many of the Array methods should be > > brought over to Enumerable. You could bring over just > about > > any one that is non-modifying and operates sequentially > forward > > on the array, but you may also restrict the ones related to > an > > "index": > > > > *, +, <=>, ==, assoc, compact, concat, empty?, eql?, first, > > flatten, hash, join, last, length, nitems, pack, rassoc, > size, > > to_s, uniq > > Some of these would fare better than others. agreed. I just listed all of them that were read-only and operate sequentially forward in across the array. I think all of these could be easily implemented in enumerable, but not all make necessarily make sense. > #flatten has no general > meaning for an enumerable, since not all of them are > recursive container objects. Array#flatten only descends into Array elements, and an Enumerable#flatten might only descend into Enumerable (or Array) elements. > I don't think you can #pack an arbitrary > enumerable either. #size also doesn't work for enumerables > in > general, partly because some of them have no particular size > and > partly because even for those that do, taking the size might > cause > side-effects (e.g., an I/O-based enumerable). Using any enumerable method with IO has the same issue. You'll need to seek back between calls to any of the enumerable methods on an IO. Of course their is an easy (but not quite as efficient) way to do any of the array methods on an enumerable: just call to_a first (i.e. enum.to_a.join(" ") does a join for any enumerable). Yahoo! Mail Stay connected, organized, and protected. Take the tour: http://tour.mail.yahoo.com/mailtour.html