[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Dummy question about method in class

Valentino Lun

2/18/2009 3:36:00 PM

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
--
Posted via http://www.ruby-....

3 Answers

Florian Gilcher

2/18/2009 3:42:00 PM

0


On Feb 18, 2009, at 4:36 PM, Valentino Lun wrote:
>
> [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: flo@andersground.net
jabber: Skade@jabber.ccc.de
gpg: 533148E2


Robert Klemme

2/18/2009 9:49:00 PM

0

On 18.02.2009 16:36, Valentino Lun wrote:
> [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

Brian Candler

2/19/2009 9:13:00 AM

0

Valentino Lun wrote:
> 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 }
--
Posted via http://www.ruby-....