HelloPhysicsWorld->vecmath-ruby->chapter5.1

 ごめんなさい、前回のchapter5で、嘘ついていました><


http://d.hatena.ne.jp/paella/20070204/1170596857
http://d.hatena.ne.jp/paella/20070205/1170686957

rubyには値渡ししかなく引き数として与えられた変数の値を変えても元の式の値は変わりません.ただし,オブジェクトの参照が渡るので値に対して破壊的な操作は可能です.


ただし,オブジェクトの参照が渡るので値に対して破壊的な操作は可能だとのことです。ので、こう書けますね。

class Vector3
  attr_accessor :x,:y,:z
end

class Matrix3
  attr_accessor :m00,:m01,:m02
  attr_accessor :m10,:m11,:m12
  attr_accessor :m20,:m21,:m21
  def initialize m00=0,m01=0,m02=0,
                 m10=0,m11=0,m12=0,
                 m20=0,m21=0,m22=0
    
    @m00,@m01,@m02 = m00,m01,m02
    @m10,@m11,@m12 = m10,m11,m12
    @m20,@m21,@m22 = m20,m21,m22
  end
  
  def get_row row,vec
    raise "" unless row < 3
    
    case row
    when 0
      vec.x = @m00
      vec.y = @m01
      vec.z = @m02
    when 1
      vec.x = @m10
      vec.y = @m11
      vec.z = @m12
    when 2
      vec.x = @m20
      vec.y = @m21
      vec.z = @m22
    end
    
    print 'foo '; p vec
    vec = Vector3.new   #仮引数は「オブジェクトの参照の値」のコピーなので
                        #オブジェクトの参照自体に影響は無い
    print 'hoge'; p vec
  end
end

vec = Vector3.new
mat = Matrix3.new(1,2,3,4,5,6,7,8,9)

p vec                #=>#<Vector3:0x287dd48>

mat.get_row(0,vec)   #=>foo #<Vector3:0x287dd48 @x=1, @z=3, @y=2>
                     #=>hoge#<Vector3:0x287d924>

p vec                #=>#<Vector3:0x287dd48 @x=1, @z=3, @y=2>

mat.get_row(1,vec)   #=>foo #<Vector3:0x287dd48 @x=4, @z=6, @y=5>
                     #=>hoge#<Vector3:0x287d85c>

p vec                #=>#<Vector3:0x287dd48 @x=4, @z=6, @y=5>

mat.get_row(2,vec)   #=>foo #<Vector3:0x287dd48 @x=7, @z=9, @y=8>
                     #=>hoge#<Vector3:0x287d794>

p vec                #=>#<Vector3:0x287dd48 @x=7, @z=9, @y=8>

はい、大丈夫ですね^^