Forum: Ruby Extending Float

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
8f196eedfa0d23f02e6d92159e84e63d?d=identicon&s=25 Jp Hastings-spital (jphastings)
on 2009-05-21 17:11
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
5772c599ccab3081e0fffb1d54f3b6de?d=identicon&s=25 Andrew Timberlake (andrewtimberlake)
on 2009-05-21 17:30
(Received via mailing list)
On Thu, May 21, 2009 at 5:11 PM, Jp Hastings-spital
<jphastings@gmail.com> wrote:
> --
> 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

Use a delegate class

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

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

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

"I have never let my schooling interfere with my education" - Mark Twain
8f196eedfa0d23f02e6d92159e84e63d?d=identicon&s=25 Jp Hastings-spital (jphastings)
on 2009-05-21 18:03
Thanks so much - and for being so quick!
753dcb78b3a3651127665da4bed3c782?d=identicon&s=25 Brian Candler (candlerb)
on 2009-05-21 18:04
Jp Hastings-spital wrote:
> puts Percentage.new(0.5)
> --
> I just get the following error:
>   NoMethodError: undefined method ‘new’ for Percentage:Class

That's because you can't do Float.new either.
8f196eedfa0d23f02e6d92159e84e63d?d=identicon&s=25 Jp Hastings-spital (jphastings)
on 2009-05-22 19:30
Brian Candler wrote:
> 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?
703fbc991fd63e0e1db54dca9ea31b53?d=identicon&s=25 Robert Dober (Guest)
on 2009-05-22 21:29
(Received via mailing list)
On Fri, May 22, 2009 at 7:30 PM, Jp Hastings-spital
<jphastings@gmail.com> wrote:
> Brian Candler wrote:
>> 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?
This is what happenes in numeric.c
    rb_cFloat  = 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
=> nil
irb(main):006:0> class W < Float
irb(main):007:1> end
=> nil
irb(main):008:0> x=W::new 42
=> 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.

> --
> Posted via http://www.ruby-forum.com/.
>
>



--
Toutes les grandes personnes ont d’abord été des enfants, mais peu
d’entre elles s’en souviennent.

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

[Antoine de Saint-Exupéry]
This topic is locked and can not be replied to.