|
|
|
#1 |
|
Messages: n/a
Hébergeur: |
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-forum.com/. |
|
|
|
#2 |
|
Messages: n/a
Hébergeur: |
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-forum.com/. > > |
|
|
|
#3 |
|
Messages: n/a
Hébergeur: |
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 |
|
|
|
#4 |
|
Messages: n/a
Hébergeur: |
[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 > > |
|
|
|
#5 |
|
Messages: n/a
Hébergeur: |
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> |
|
![]() |
| Outils de la discussion | |
|
|