Forum: Ruby How to override Numeric class

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Bojan M. (Guest)
on 2006-01-06 18:36
(Received via mailing list)
Hi all,
I am new to Ruby and am trying to overload "+" operator on Integer
class, without success.

class TestNum < Integer
  def +(other)
       self.value - other
  end
end

puts TestNum.new(5)+5; # should return 0

I know that it should be simple, but.... any help appreciated.
Robert K. (Guest)
on 2006-01-06 19:00
(Received via mailing list)
Bojan M. wrote:
> puts TestNum.new(5)+5; # should return 0
>
> I know that it should be simple, but.... any help appreciated.

Did you look at the error?

?> TestNum.new(5)+5
NoMethodError: undefined method `new' for TestNum:Class
        from (irb):7
        from :0

Your problem starts already with the creation...  Integer is an abstract
class and I suspect it does something to #new.

You should also look at #coerce, see
http://www.rubygarden.org/ruby?CoerceExplanation for example if you want
to implement operators properly.

Kind regards

    robert
James G. (Guest)
on 2006-01-06 19:06
(Received via mailing list)
On Jan 6, 2006, at 10:35 AM, Bojan M. wrote:

> puts TestNum.new(5)+5; # should return 0
>
> I know that it should be simple, but.... any help appreciated.

Ruby provides the coerce method, for hooking into its math routines:

 >> class TestNum
 >>   def initialize( value )
 >>     @value = value
 >>   end
 >>   attr_reader :value
 >>   def +( other )
 >>     if other.is_a? self.class
 >>       value + other.value
 >>     else
?>       value + other
 >>     end
 >>   end
 >>   def coerce( other )
 >>     [self.class.new(other), self]
 >>   end
 >> end
=> nil
 >> tn = TestNum.new(5)
=> #<TestNum:0x31d2b8 @value=5>
 >> tn + 5
=> 10
 >> tn + tn
=> 10
 >> 5 + tn
=> 10

Hope that helps.

James Edward G. II
Bojan M. (Guest)
on 2006-01-06 20:57
(Received via mailing list)
Thanks James. As I understand coerce method in Ruby classes is to assure
'other' is of right type and that operation could be performed. In this
example coerce is called from FixNum class, and '+' method is always
preformed in TestNum class, right?
James G. (Guest)
on 2006-01-06 21:06
(Received via mailing list)
On Jan 6, 2006, at 12:57 PM, Bojan M. wrote:

> Thanks James. As I understand coerce method in Ruby classes is to
> assure 'other' is of right type and that operation could be
> performed. In this example coerce is called from FixNum class, and
> '+' method is always preformed in TestNum class, right?

Yes, that's correct.

James Edward G. II
This topic is locked and can not be replied to.