From: "David A. Black" Date: 2010-06-07T18:42:08+09:00 Subject: Re: inject method of Array class Hi -- On Mon, 7 Jun 2010, Rein Henrichs wrote: > On 2010-06-06 17:55:58 -0700, David A. Black said: > >> Hi -- >> >> On Mon, 7 Jun 2010, Rein Henrichs wrote: >> >>> In addition to the previously mentioned difference between #methods and >>> #instance_methods, #inject is actually a method on the Enumerable module, >>> which is mixed into Array (and other classes that have #each). The >>> Enumerable >>> module is full of methods that can be used on "things that can enumerate >>> themselves", like Arrays, Hashes and Sets. >> >> Although a surprising (to me) number of Enumerable's instance methods >> are overridden in Array: >> >> irb(main):008:0> (Array.instance_methods(false) & >> Enumerable.instance_methods).sort >> => ["collect", "count", "cycle", "drop", "drop_while", "find_index", >> "first", "include?", "map", "reject", "reverse_each", "select", >> "sort", "take", "take_while", "to_a", "zip"] >> >> (That's 1.8.7 but the list is the same in 1.9.1.) >> >> >> David > > I suspect that the majority are overwritten for performance reasons, although > some of them surprise me as well. > > A linked list, for instance, would have a constant time #count because that > state is kept on the list object and doesn't require an O(n) enumeration of > the members. I think it's a mixture of performance reasons and things like what it should return if there's no block (like Enumerable#map always returning an array vs. Array#map returning its receiver). Array is definitely the one that has the most overrides, with Hash coming in second at 6 and IO having none. David -- David A. Black, Senior Developer, Cyrus Innovation Inc. THE Ruby training with Black/Brown/McAnally COMPLEAT Coming to Chicago area, June 18-19, 2010! RUBYIST http://www.compleatrubyist.com