From: Jeppe Jakobsen Date: 2006-02-13T06:05:23+09:00 Subject: Re: Implanting a new method for a class ------=_Part_7544_26083279.1139778309456 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Thank you, for sorting things out for me :) 2006/2/12, Levin Alexander : > > On 2/12/06, Jeppe Jakobsen wrote: > > Hi there, I have a question regarding how to implant a new method into > the > > class Array. I would like to write a ruby file that sums all of the > digits > > in an array. I have tried this: > > > > class Array > > def Array.sum > > until (Array.empty?) > > arraySum +=3D Array.pop > > end > > puts arraySum > > end > > end > > > > Gave no error when I ran the code. My problem occur when i try to use > this > > method: > > > > require "Library/Array_sum.rb" > > a =3D [1..100] > > a.sum > > > > I get a NoMethodError on sum. Can anybody tell me what I did wrong here= ? > > Thanks in advance :) > > You are confusing classes and instances of classes. You are defining > methods for the Array class, not for actual array instances. > > class A > def A.foo > puts "Class method of #{self.inspect}, instance of class #{ > self.class}" > end > def foo > puts "Instance method for #{self.inspect}, of class #{self.class}" > end > end > > A.foo # prints "Class method of A, instance of class Class" > a =3D A.new > a.foo # prints "Instance method of <#A:0xb7ce9000> of class A" > > You can implement sum like so: > > class Array > def sum > total =3D 0 > # self refers to the current array instance > self.each { |elem| total +=3D elem } > total > end > > # but you can also implement sum on the class Array itself. But then > # you need to provide the array, that you want to know the sum of > # > def Array.sum arr > arr.inject(0) { |total, elem| total +=3D elem } > end > end > > puts [1,2,3,4].sum > puts Array.sum([1,2,3,4,5]) > > be careful with "pop", it changes the Array! > > def sum!(arr) > total =3D 0 > total +=3D arr.pop until a.empty? > total > end > > arr =3D [5,4,3] > p arr.sum! #=3D> 12 > p arr #=3D> [] arr is now empty! > > > -Levin > -- "winners never quit, quitters never win" ------=_Part_7544_26083279.1139778309456--