我正在为ruby的narray(数字数组)创建一个包装类。我希望我的类以Narray实例的方式响应所有标准数学运算符(+,+=,-,-=,*,*=,等等)。我知道如何为Array
s和其他Enumerable
对象创建包装器,在包装器中包含Enumerable
,并定义一个只重定向到包装的each
对象的Enumerable
方法。我想要一个和那雷类似的东西。有没有一个模块可以包含/方法我可以定义,它将定义整个数学运算符的集合,目标是包装好的Narray?或者我必须手动定义它们吗?
最佳答案
您可以使用Forwardable
:
require 'forwardable'
class MyWrapper
extend Forwardable
def_delegators :@narray, :+, :*, # etc...
def initialize(narray)
@narray = narray
end
end
我不确定这是否适用于
+=
等方法(我不知道它们是如何实现的,但我相信它们是解析器的一个特性,而不是您可以引用的方法)。在mywrapper的实例上调用
+=
将设置对该操作结果的引用,因此您需要找到一种方法使其返回相同的实例。这就提出了一个问题——这是您想要做的(作为数学运算的结果返回一个包装好的Narray),还是您希望Narray处理返回?