Extending Float

J

Jp Hastings-spital

Maybe I haven't wrapped my head around OOP in the way I should have, can
anyone explain to me why I can't do this?:
--
class Percentage < Float
def to_s(decimalplaces = 0)
(((self * 10**(decimalplaces+2)).round)/10**decimalplaces).to_s+"%"
end
end

puts Percentage.new(0.5)
--
I just get the following error:
NoMethodError: undefined method ‘new’ for Percentage:Class

I hope its obvious what I'm trying to do, let me know if there's a way
to achieve this that I'm missing!
Thanks in advance
 
A

Andrew Timberlake

Maybe I haven't wrapped my head around OOP in the way I should have, can
anyone explain to me why I can't do this?:
--
class Percentage < Float
=A0def to_s(decimalplaces =3D 0)
=A0 =A0(((self * 10**(decimalplaces+2)).round)/10**decimalplaces).to_s+"%= "
=A0end
end

puts Percentage.new(0.5)
--
I just get the following error:
=A0NoMethodError: undefined method =91new=92 for Percentage:Class

I hope its obvious what I'm trying to do, let me know if there's a way
to achieve this that I'm missing!
Thanks in advance

Use a delegate class

require 'delegate'
class Percentage < DelegateClass(Float)
def to_s(decimalplaces =3D 0)
(((self * 10**(decimalplaces+2)).round)/10**decimalplaces).to_s+"%"
end
end

percentage =3D Percentage.new(0.5)
percentage.to_s #=3D> "50%"

Andrew Timberlake
http://ramblingsonrails.com
http://www.linkedin.com/in/andrewtimberlake

"I have never let my schooling interfere with my education" - Mark Twain
 
J

Jp Hastings-spital

Brian said:
That's because you can't do Float.new either.

So, out of interest, how does a Float get initialized (what function is
called)? Or is that some fancy inbuilt something-or-other?
Logically I'd assume I'd be able to do
my_pc = Percentage = 0.5
or something along those lines. What do you reckon?
 
R

Robert Dober

So, out of interest, how does a Float get initialized (what function is
called)? Or is that some fancy inbuilt something-or-other?
Logically I'd assume I'd be able to do
=A0my_pc =3D Percentage =3D 0.5
or something along those lines. What do you reckon?
This is what happenes in numeric.c
rb_cFloat =3D rb_define_class("Float", rb_cNumeric);

rb_undef_alloc_func(rb_cFloat);
rb_undef_method(CLASS_OF(rb_cFloat), "new");

Probably for some good reasons, however *you* are king

irb(main):001:0> class Float
irb(main):002:1> def self.new x
irb(main):003:2> Float( x )
irb(main):004:2> end
irb(main):005:1> end
=3D> nil
irb(main):006:0> class W < Float
irb(main):007:1> end
=3D> nil
irb(main):008:0> x=3DW::new 42
=3D> 42.0

How floats get initialized? I dunno, but it is my guess that the
parser generates some code very similar to what is in Kernel#Float.
But for some reason my grep skills elude me to find the code of
Kernel#Float.



--=20
Toutes les grandes personnes ont d=92abord =E9t=E9 des enfants, mais peu
d=92entre elles s=92en souviennent.

All adults have been children first, but not many remember.

[Antoine de Saint-Exup=E9ry]
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
474,262
Messages
2,571,056
Members
48,769
Latest member
Clifft

Latest Threads

Top