用于在Ruby中定义数学运算是否等效于“Enumerable”?

时间:2012-11-04 00:18:48

标签: ruby

我正在为Ruby的NArray(数值数组)创建一个包装类。我希望我的班级以与NArray实例相同的方式响应所有标准数学运算符(+,+ =, - , - =,*,* =等)。我知道如何为Array和其他Enumerable对象创建包装器,在包装器中包含Enumerable,并定义一个仅重定向到包装{{1}的each方法对象。我想要与NArray类似的东西。是否有一个模块可以包含/我可以定义的方法,它将定义整个数学运算符以定位包裹的NArray?或者我必须手动定义它们吗?

1 个答案:

答案 0 :(得分:2)

您可以使用Forwardable

require 'forwardable'
class MyWrapper

  extend Forwardable
  def_delegators :@narray, :+, :*, # etc...

  def initialize(narray)
    @narray = narray
  end
end

我不确定这是否适用于+=等方法(我不确切知道它们是如何实现的,但我相信它们是解析器的一个特性,而不是实际可以引用的方法)。

在MyWrapper实例上调用+=会设置对该操作结果的引用,因此您需要找到一种方法来返回相同的实例。这提出了一个问题 - 你想做什么(返回一个包裹的NArray作为数学运算的结果),或者你期望你的NArray处理回报?