[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Modifying FIX::* method

Alex DeCaria

3/31/2008 5:59:00 PM

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.
--
Posted via http://www.ruby-....

4 Answers

Jason Roelofs

3/31/2008 6:25:00 PM

0

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
<alex.decaria@millersville.edu> wrote:
> 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.
> --
> Posted via http://www.ruby-....
>
>

Adam Shelly

3/31/2008 6:27:00 PM

0

On 3/31/08, Alex DeCaria <alex.decaria@millersville.edu> 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

Shawn Anderson

3/31/2008 6:35:00 PM

0

[Note: parts of this message were removed to make it a legal post.]

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

/Shawn

On Mon, Mar 31, 2008 at 11:27 AM, Adam Shelly <adam.shelly@gmail.com> wrote:

> On 3/31/08, Alex DeCaria <alex.decaria@millersville.edu> 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 Shelly

3/31/2008 6:38:00 PM

0

On 3/31/08, Adam Shelly <adam.shelly@gmail.com> wrote:
> On 3/31/08, Alex DeCaria <alex.decaria@millersville.edu> 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.
>

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>