HelloPhysicsWorld->vecmath-ruby->chapter3

 Tuple2,Tuple3,Tuple4の検討案。
module入れ子にしていって、差分だけ記載するようにしたが、ん〜。
寝て頭リセットしたけど微妙かな。


 eval系*1使った方が簡潔にかけるかな?
でも速度的なもの考えるとevalってのも。


 まあ一番問題なのはPoint4がPoint2,Point3,Point4すべてにadd()出来てることなんですけどw

module Tuple2
  attr_accessor :x,:y
  def initialize x,y
    @x,@y = x,y
  end
  
  def add obj;  @x += obj.x;@y += obj.y;  self; end
end

module Tuple3
  include Tuple2
  attr_accessor :z
  def initialize x,y,z
    super(x,y)
    @z = z
  end
  
  def add obj;  super(obj);@z += obj.z;  self; end
end

module Tuple4
  include Tuple3
  attr_accessor :w
  def initialize x,y,z,w
    super(x,y,z)
    @w = w
  end
  
  def add obj;  super(obj);@w += obj.w;  self; end
end

class Point2
  include Tuple2
end

class Point3
  include Tuple3
end

class Point4
  include Tuple4
end

p Point2.new(1,2).x       #=>1
p Point2.new(1,2).y       #=>2

p Point3.new(3,4,5).x     #=>3
p Point3.new(3,4,5).y     #=>4
p Point3.new(3,4,5).z     #=>5

p Point4.new(6,7,8,9).x   #=>6
p Point4.new(6,7,8,9).y   #=>7
p Point4.new(6,7,8,9).z   #=>8
p Point4.new(6,7,8,9).w   #=>9

a = Point4.new(10,10,10,10)
p '-'*10

p Point2.new(1,2).add(a).x       #=>11
p Point2.new(1,2).add(a).y       #=>12

p Point3.new(3,4,5).add(a).x     #=>13
p Point3.new(3,4,5).add(a).y     #=>14
p Point3.new(3,4,5).add(a).z     #=>15

p Point4.new(6,7,8,9).add(a).x   #=>16
p Point4.new(6,7,8,9).add(a).y   #=>17
p Point4.new(6,7,8,9).add(a).z   #=>18
p Point4.new(6,7,8,9).add(a).w   #=>19

 まあ動いてるからいいか>A<

*1:evalについては不勉強なので今回避けています