我正在为ruby的narray(数字数组)创建一个包装类。我希望我的类以Narray实例的方式响应所有标准数学运算符(+,+=,-,-=,*,*=,等等)。我知道如何为Arrays和其他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处理返回?

09-28 02:48