Ruby Matrix类的复制/inheritance(core / std lib)

我试图在Ruby中扩展一个现有的Singleton类,作为Matrix类的一个例子。

我的第一个快速和肮脏的解决方案是一个猴子补丁(重新打开类并扩展function)。

但我认为,猴子修补一般不好,特别是如果有人试图覆盖核心类的基本方法,如String,Integer,……

下一步是找出如何使用新名称(如MatrixExt)获取Matrix类的真实硬拷贝,该名称表现为独立的单例。

MatrixExt = Matrix 

没有工作,因为它导致:

 MatrixExt.scalar(2,0) => Matrix[[0, 0], [0, 0]] 

所以我只为同一个单身人士获得多个名字。 不,我想要的。

clonedup方法的结果相同。

类inheritance也不起作用:

 class MatrixExt  Matrix[[0, 0], [0, 0]] 

这是最令人困惑的部分,因为在自定义类中,可以获得inheritance的类。 (那么,为什么core / std lib类的工作方式不同?)

我目前的解决方案是使用扩展模块,然后在初始化后显式使用.extend ,如:

 m = Matrix.scalar(2,0).extend(MatrixExtModule) 

现在没关系,但我的问题是:

是否有另一种解决方案 – 当是 – 如何做到这一点?

(不,复制matrix.rb当然不是一个好方法。; o)

我做错了什么或我认为错误的方式?

提前感谢任何解决方案和/或食物的想法!

这是一个错误。

我在redmine.ruby-lang.org上创建了一个问题 ,建议修复这些问题。

我修复了库,但是恐怕在Ruby 1.9.4之前它不可用。

如果你看一下Matrix是如何实现的,你会注意到所有的方法,如scalardiagonal等都会调用私有的new方法,它总会返回一个新的Matrix对象(你不会覆盖这些方法,所以Ruby会去看一下超类实现,其中new的隐式接收器是self ,即Matrix类)。

我想你最好的办法就是将所有补丁包装在一个模块中,然后将补丁Matrix包裹起来。