我需要对我的+/-重写方法提供一些帮助,它不会影响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>
*
和/
工作正常,矢量应该乘以/除以标量。
答案 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]