gj(a)を実行するとaが壊れてしまうので,b=aとして取っておいてから,
gj(a)を実行したが,そのあとbを見たらbも壊れてしまっていた.
irb(main):001:0> a=[[1,2],[3,4]]
=> [[1, 2], [3, 4]]
irb(main):002:0> b=a
=> [[1, 2], [3, 4]]
irb(main):003:0> a[0][0]=0
=> 0
irb(main):004:0> b
=> [[0, 2], [3, 4]]
のように再現できる.
Ruby言語ではaが配列の時,b=a はaの配列のコピーを作成してbに入れるのでは
なく,bとaが同じ配列を指すようにします.中身のコピーを作るには,b=a.dup()
とすれば良いのですが,aが2次元配列の時は,これでは不十分で,
b=a.map{|v| v.dup()}
とする必要があります.
irb(main):001:0> a=[[1,2],[3,4]]
=> [[1, 2], [3, 4]]
irb(main):002:0> b=a.map{|v| v.dup}
=> [[1, 2], [3, 4]]
irb(main):003:0> a[0][0]=0
=> 0
irb(main):004:0> a
=> [[0, 2], [3, 4]]
irb(main):005:0> b
=> [[1, 2], [3, 4]]
のようになります.ただ,この書き方は講義の範囲を超えているので扱いませんでした.