inject method of Array class

  • Thread starter RichardSchollar
  • Start date
R

RichardSchollar

I have only just started using Ruby (and am a total noob, in case this
wasn't obvious ;-)) and was wondering if I type the following into irb
(for instance) I don't see the "include" method listed:

Array.methods

Nor do I see the "each" method listed so I assume this is by design
rather than being an omission.

Would someone be so kind as to enlighten me why this is the case?

Many thanks.

Richard
 
B

Brian Candler

RichardSchollar said:
I have only just started using Ruby (and am a total noob, in case this
wasn't obvious ;-)) and was wondering if I type the following into irb
(for instance) I don't see the "include" method listed:

Array.methods

You want: Array.instance_methods

(that is: not methods of the class Array object itself, but methods of
objects which are instances of class Array)
 
B

Brian Candler

Brian said:
You want: Array.instance_methods

(that is: not methods of the class Array object itself, but methods of
objects which are instances of class Array)

Or alternatively you could do: Array.new.methods
to create an instance, and then see what methods it has.

irb(main):001:0> Array.new.methods.grep(/inject/)
=> ["inject"]
 
D

David A. Black

Hi --

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

--
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
 
R

RichardSchollar

Thanks everyone - I appreciate all the responses and it has clarified
what I was seeing.
 
D

David A. Black

Hi --

Hi --

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
 
R

Robert Klemme

2010/6/7 David A. Black said:
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, I guess you meant to write "... vs. Array#map! returning its
receiver"? Note the exclamation mark. Array#map returns a new Array
on every invocation.

Kind regards

robert
 
D

David A. Black

Hi --

David, I guess you meant to write "... vs. Array#map! returning its
receiver"? Note the exclamation mark. Array#map returns a new Array
on every invocation.

I really meant to say a copy of its receiver -- I was looking at this:

if (!rb_block_given_p()) {
return rb_ary_new4(RARRAY(ary)->len, RARRAY(ary)->ptr);
}

from array.c.


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
 
R

Rick DeNatale

Indeed. The Rubinius implementations of these Array methods are quite
revealing. It is easy to see the difference between them and their
Enumerable counterparts.

None of this is surprising to me as an old Smalltalker. Parts of the
Ruby implementation take the same view of inheritance and overriding
as in Smalltalk, inheritance is simply a convenient technique for the
implementation of behavior, not for building formal hierarchies.

I really should turn this into a blog article I guess.

--=20
Rick DeNatale

Blog: http://talklikeaduck.denhaven2.com/
Github: http://github.com/rubyredrick
Twitter: @RickDeNatale
WWR: http://www.workingwithrails.com/person/9021-rick-denatale
LinkedIn: http://www.linkedin.com/in/rickdenatale
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
474,150
Messages
2,570,853
Members
47,394
Latest member
Olekdev

Latest Threads

Top