我尝试在 Ruby 中扩展现有的 Singleton 类,例如 Matrix 类。
我的第一个快速而肮脏的解决方案是猴子补丁(重新打开类并扩展功能)。
但我认为,猴子修补一般来说并不好,尤其是当有人试图覆盖核心类的基本方法时,如 String、Integer、...
下一步是找出如何获得具有新名称(如 MatrixExt)的 Matrix 类的真实硬拷贝,它的行为就像一个独立的单例。
MatrixExt = Matrix
没有完成工作,因为它导致:
MatrixExt.scalar(2,0)
=> Matrix[[0, 0], [0, 0]]
所以我只能为同一个单例获得多个名字。不是,我想要的。
与 clone
和 dup
方法的结果相同。
类继承也不起作用:
class MatrixExt < Matrix
# patches ...
end
MatrixExt.scalar(2,0)
=> Matrix[[0, 0], [0, 0]]
这是最令人困惑的部分,因为在自定义类中,可以获得继承类。 (那么,为什么核心/标准库类的工作方式不同?)
我目前的解决方案是有一个带有扩展的模块,然后在初始化后显式地使用 .extend
,例如:
m = Matrix.scalar(2,0).extend(MatrixExtModule)
现在没问题,但我的问题是:
是否有其他解决方案?如果有,该怎么做?
(不,复制 matrix.rb 当然不是一个好方法。;o)
我做错了什么或我的想法有误?
在此先感谢您提供任何解决方案和/或思考问题!
最佳答案
关于ruby - Ruby Matrix 类的复制/继承(核心/标准库),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6064902/