我可以很容易地继承,例如String
,例如:
class MyString < String
def stuff
self + ' and stuff'
end
end
# This works:
MyString.new('things').stuff # => 'things and stuff'
但是我如何从Rational
继承,它没有构造函数?例如:
def MyRat < Rational
def inc
self + 1
end
end
# I have tried to initialize like this:
MyRat.new(10).inc # => NoMethodError: undefined method `new' for MyRat:Class
MyRat(10).inc # => NoMethodError: undefined method `MyRat' for main:Object
MyRat.send(:initialize, 10).inc # => TypeError: already initialized class
# ???
# None of it works!
我无法找到初始化新课程的方法。
答案 0 :(得分:5)
您可以将自己的对象定义为围绕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
将使用您的类中定义的方法,否则该类将委托给有理实例。
r = MyRat.new(10)
# MyRat#inc is used
r.inc
# => (11/1)
# to_int delegates to Rational
r.to_int
# => 10
中提供了因为数字没有初始化的部分解释
查看C代码,我看到Numeric和Float中存在new(), 但它被特别删除: 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");
ruby源代码不包含删除新内容的说明。 这就是为什么我想知道这背后的原因是什么。确实如此 在ruby解释器中似乎不是技术限制。 目前,对我来说没有多大意义。
原因是因为
这是内部优化。不必创建Fixnums 他们永远不必被GC。这对于加快数学运算有很长的路要走 而不是普通物体(至少对于Fixnums)。
本文The Complete Numeric Class解释了其他建议和替代方案。