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については不勉強なので今回避けています