Ruby运算符重载对自定义类对象无法正常工作

时间:2015-01-07 19:00:34

标签: ruby operator-overloading override

我需要对我的+/-重写方法提供一些帮助,它不会影响wektor数组的元素。

class Wektor
  attr_accessor :coords

  def initialize(length)
    @coords = Array.new(length, 0)
  end

  def set!(w)
    @coords = w.dup

    self
  end

  %i(* /).each do |op|
    define_method(op) do |n|
      coords.map! { |i| i.send(op, n) }

      self
    end
  end

  %i(- +).each do |op|
    define_method(op) do |v|
      @coords.zip(v).map { |a, b| a.send(op, b) }

      self
    end
  end

  def shift_right!
    coords.rotate!
    coords[0] = 0

    self
  end


end

所以基本上如果a = Wektor.new(4).set!([1,2,3,4]b = Wektor.new(4).set!([1,1,1,1]我希望a-b设置a = [0,1,2,3]这个方法有什么问题?它没有改变任何内容 - a仍然设置为[1,2,3,4]

我尝试过使用IRB进行调试,但它并没有给我任何关于错误的线索。

代码看起来对我很好,但是我在编写ruby-way代码时起初很重要(我不是这段代码的作者)而且我很难发现错误。< / p>

*/工作正常,矢量应该乘以/除以标量。

1 个答案:

答案 0 :(得分:1)

请改为尝试:

%i(- +).each do |op|
  define_method(op) do |v|
    @coords = @coords.zip(v.coords).map { |a, b| a.send(op, b) }
    self
  end
end

您希望zip数组,因此在coords上调用v可以使其正常工作。此外,map执行给定的块并返回收集的结果,您将丢弃它们。

你知道Ruby有一个Vector类吗?

2.1.5 :001 > require 'matrix'
 => true 
2.1.5 :002 > a = Vector[1,2,3,4]
 => Vector[1, 2, 3, 4] 
2.1.5 :003 > b = Vector[1,1,1,1]
 => Vector[1, 1, 1, 1] 
2.1.5 :004 > a - b
 => Vector[0, 1, 2, 3] 
2.1.5 :005 > a * 3
 => Vector[3, 6, 9, 12]