Class Foo
def initialize(x) @x = x
end
attr_read :x
end
I want to be able to multiply a NUMERIC object by my Foo object and have
it return a new Foo object with all the instance variables multiplied by
the Numeric object. For example:
y = Foo.new(3)
z = 2*y
print z.x => 6
or
z = 2.0*y
print z.x => 6.0
I’m thinking I have to modify the “*” method for all the subclasses of
the NUMERIC class. Is this correct? Or am I missing something.
I know I can put a “" method in my Foo class, and get it to do things
like "y2”, but how do I get “2*y”?
I want to be able to multiply a NUMERIC object by my Foo object and have
it return a new Foo object with all the instance variables multiplied by
the Numeric object.
[…]
I’m thinking I have to modify the “*” method for all the subclasses of
the NUMERIC class. Is this correct? Or am I missing something.
You don’t need to modify Numeric, you just need to tell it how to
coerce your object into a number.
irb(main):057:0* class Foo
irb(main):058:1> def initialize(x)
irb(main):059:2> @x=x
irb(main):060:2> end
irb(main):061:1> def coerce(n)
irb(main):062:2> [n,@x]
irb(main):063:2> end
irb(main):064:1> end
=> nil
irb(main):065:0> 2 + Foo.new(3)
=> 5
irb(main):066:0> f=Foo.new(4)
=> #<Foo:0x283b13c @x=4>
irb(main):067:0> 8/f
=> 2
Oops, I didn’t read your message closely enough. Maybe Jason is
right, and you shouldn’t even consider doing this, but something like
the following should work:
class Foo
attr_reader :x,:y
def initialize(x,y)
@x=x
@y=y
end
def coerce(n)
[Foo.new(n,n),self]
end
def +(other)
Foo.new(@x+other.x,@y+other.y)
end
def /(other)
Foo.new(@x/other.x,@y/other.y)
end
end
p (2 + Foo.new(3,0)) #=> #<Foo:0x27afcb8 @y=2, @x=5>
p f=Foo.new(4,10) #=> #<Foo:0x27afc68 @y=10, @x=4>
p 100/f #=> #<Foo:0x27afbdc @y=10, @x=25>
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.