Dummy question about method in class

V

Valentino Lun

Dear all

I have a dummy question.

[1,2,3,4,5].inject { |sum,n| sum+n }
The inject method in this case is to calculate the sum of array.

I searched the RDoc. Why the inject method is belongs to Enumerable
Class, but not Array Class?

Many thanks
Valentino
 
F

Florian Gilcher

[1,2,3,4,5].inject { |sum,n| sum+n }
The inject method in this case is to calculate the sum of array.

I searched the RDoc. Why the inject method is belongs to Enumerable
Class, but not Array Class?

Enumerable is a Module, not a Class. It can be mixed into other
classes, so the Class gains the Methods of the module. Arrays uses
Enumerable instead of implementing #inject on its own, so they respond
to Enumerables #inject.

As a short presentation, i redefine Enumerable#inspect to do something
different (never try this at home!):

===
module Enumerable
def inject
puts "hey"
end
end

[].inject #=> puts "hey" now
===

Regards,
Florian Gilcher

--
Florian Gilcher

smtp: (e-mail address removed)
jabber: (e-mail address removed)
gpg: 533148E2
 
R

Robert Klemme

[1,2,3,4,5].inject { |sum,n| sum+n }
The inject method in this case is to calculate the sum of array.

Additional to Florian's good explanation: be aware that the version you
posted has a special property: it will return nil for empty Enumerables.

Consider this version which in most cases is the one you want (an empty
list summed up results in 0):

[1,2,3,4,5].inject(0) { |sum,n| sum+n }

Kind regards

robert
 
B

Brian Candler

Valentino said:
I have a dummy question.

[1,2,3,4,5].inject { |sum,n| sum+n }
The inject method in this case is to calculate the sum of array.

I searched the RDoc. Why the inject method is belongs to Enumerable
Class, but not Array Class?

The Enumerable module can be shared by many classes. Any class which
implements its own 'each' method can mixin Enumerable and gain a whole
load of functionality.

For example:

class Fib
include Enumerable
def initialize(a,b,count)
@a, @b, @count = a, b, count
end
def each
@count.times do
yield @a
@a, @b = @b, @a+@b
end
end
end

p Fib.new(1,1,10).inspect
p Fib.new(1,1,10).max
p Fib.new(1,1,10).inject(0) { |sum,n| sum+n }
 

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
473,755
Messages
2,569,537
Members
45,021
Latest member
AkilahJaim

Latest Threads

Top