# Modifying FIX::\* method

**URL:** <https://www.ruby-forum.com/t/modifying-fix-method/133463>\
**Category:** Ruby\
**Created:** [March 31, 2008, 7:58pm UTC](https://www.ruby-forum.com/t/modifying-fix-method/133463 "2008-03-31T19:58:27Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![alexd](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/96bed5/32.png) [@alexd](https://www.ruby-forum.com/u/alexd)\
**Post date:** [March 31, 2008, 7:58pm UTC](https://www.ruby-forum.com/t/modifying-fix-method/133463/1 "2008-03-31T19:58:27Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![alexd](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/96bed5/32.png) [@alexd](https://www.ruby-forum.com/u/alexd)\
**Post date:** [March 31, 2008, 8:25pm UTC](https://www.ruby-forum.com/t/modifying-fix-method/133463/2 "2008-03-31T20:25:27Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![alexd](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/96bed5/32.png) [@alexd](https://www.ruby-forum.com/u/alexd)\
**Post date:** [March 31, 2008, 8:27pm UTC](https://www.ruby-forum.com/t/modifying-fix-method/133463/3 "2008-03-31T20:27:55Z")

</div>

On 3/31/08, Alex DeCaria [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) 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

---

<div class="post-metadata">

**Author:** ![alexd](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/96bed5/32.png) [@alexd](https://www.ruby-forum.com/u/alexd)\
**Post date:** [March 31, 2008, 8:35pm UTC](https://www.ruby-forum.com/t/modifying-fix-method/133463/4 "2008-03-31T20:35:45Z")

</div>

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

/Shawn

---

<div class="post-metadata">

**Author:** ![alexd](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/96bed5/32.png) [@alexd](https://www.ruby-forum.com/u/alexd)\
**Post date:** [March 31, 2008, 8:38pm UTC](https://www.ruby-forum.com/t/modifying-fix-method/133463/5 "2008-03-31T20:38:42Z")

</div>

On 3/31/08, Adam S. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) 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\>
