HelloPhysicsWorld->vecmath-ruby->chapter6

 rubyのoverrideとoverloadとについて
rubyjavaのvecmathライブラリを移植するときにoverloadの実装で困ったのでメモ。


 最初にoverride。こっちは他の言語と同じ感じでいたって普通。

module Vec2
  def initialize
    p :mod_vec2_before
    super
    p :mod_vec2_after
  end
end

module Vec3
  include Vec2
  def initialize
    p :mod_vec3_before
    super
    p :mod_vec3_after
  end
end

class Vector2
  include Vec2
  def initialize
    p :vec2_before
    super
    p :vec2_after
  end
end

class Vector3 < Vector2
  include Vec3
  def initialize
    p :vec3_before
    super
    p :vec3_after
  end
end

Vector2.new  #=>:vec2_before
             #=>:mod_vec2_before
             #=>:mod_vec2_after
             #=>:vec2_after

Vector3.new  #=>:vec3_before
             #=>:mod_vec3_before
             #=>:vec2_before
             #=>:mod_vec2_before
             #=>:mod_vec2_after
             #=>:vec2_after
             #=>:mod_vec3_after
             #=>:vec3_after

superで、()を省略すると引数が全部渡されるくらい。

class Vector2
  def initialize x,y
    p x,y
    super
  end
end

class Vector3 < Vector2
  def initialize x,y,z
    p x,y,z
    super
  end
end

Vector3.new 1,2,3  #=>1
                   #=>2
                   #=>3
                   #=>C:/freetool/xyzzy/__temp_p06h.rb:11:in `initialize': wrong number of arguments (3 for 2) (ArgumentError)
                   #=>	from C:/freetool/xyzzy/__temp_p06h.rb:11:in `initialize'
                   #=>	from C:/freetool/xyzzy/__temp_p06h.rb:15:in `new'
                   #=>	from C:/freetool/xyzzy/__temp_p06h.rb:15

で、overloadについては長くなるので別で