How to override Numeric class

B

Bojan Mihelac

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.
 
R

Robert Klemme

Bojan said:
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.

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
 
J

James Edward Gray II

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.

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)
=> # said:
tn + 5 => 10
tn + tn => 10
5 + tn
=> 10

Hope that helps.

James Edward Gray II
 
B

Bojan Mihelac

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?
 
J

James Edward Gray II

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 Gray II
 

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

Forum statistics

Threads
474,201
Messages
2,571,049
Members
47,655
Latest member
eizareri

Latest Threads

Top