You can define your own object as a proxy server around Rational .
class MyRat < BasicObject def initialize(value) @rational = Rational(value) end def inc @rational + 1 end def method_missing(name, *args, &block) @rational.send(name, *args, &block) end end
The methods defined in your class are used, otherwise the class will delegate to a rational instance.
r = MyRat.new(10)
A partial explanation that Numeric does not have initialization is available in this thread.
Looking at the C code, I see that new () exists in Numeric and Float, but it is specially removed: rb_cInteger = rb_define_class ("Integer", rb_cNumeric); rb_undef_alloc_func (rb_cInteger); rb_undef_method (CLASS_OF (rb_cInteger), "new");
#....and for floats.. rb_undef_alloc_func(rb_cFloat); rb_undef_method(CLASS_OF(rb_cFloat), "new");
The source code for ruby does not explain how to remove the new one. That’s why I’m wondering what the arguments are. It does not appear to be a technical limitation in the ruby interpreter. Currently, it does not really matter to me.
and the reason is because
This is an internal optimization. Fixnums do not need to be created and they should never be GC'ed. This makes mathematics much easier than it would be with ordinary objects (at least for Fixnums).
Additional suggestions and alternatives are explained in this article Full Number Class .
source share