Modifying FIX::* method

I have a class such as

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 "y
2”, but how do I get “2*y”?

Thanks in advance.

The proper way is to implement and enforce “y * 2”. Is there any
specific reason you want people to be able to do “2 * y” ?

Jason

On Mon, Mar 31, 2008 at 1:58 PM, Alex DeCaria

On 3/31/08, Alex DeCaria [email protected] wrote:

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

-Adam

Adam,
I believe the OP wanted a Foo object returned, not a Fixnum.

/Shawn

On 3/31/08, Adam S. [email protected] wrote:

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>