From: Levin Alexander Date: 2006-02-13T05:49:13+09:00 Subject: Re: Implanting a new method for a class 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 += 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 = [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 definingmethods 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 = A.new a.foo # prints "Instance method of <#A:0xb7ce9000> of class A" You can implement sum like so: class Array def sum total = 0 # self refers to the current array instance self.each { |elem| total += 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 += 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 = 0 total += arr.pop until a.empty? total end arr = [5,4,3] p arr.sum! #=> 12 p arr #=> [] arr is now empty! -Levin