変数名を規則的に変化させる場合には,evalを使えば手動で頑張らなくていいことを知ったので備忘録として書いておきます.ただ,以下に書くものが最良とは思っていません.もし,もっと良い書き方があれば教えていただけると嬉しいです.
メソッドとして行列単位を書く
行列のサイズは2×2しか出てこないプログラムを想定する.
まずはevalを使わないで次のようにメソッドとして行列単位((i,j)成分は1,その他は0)を書いてみる.
matrix1.rb
require "matrix"
def e(i,j)
Matrix.build(2){|k,l| (k==i && l==j)? 1 : 0}
end
でもこれでは,何度もe(i,j)
が出てくると括弧を書くのが面倒になってくる.
2×2しか出てこないのだから,括弧がなくても誤解の心配はない.
そこでevalを使って括弧を外すことを試みる.
グローバル変数として行列単位を書く
matrix2.rb
require "matrix"
def e(i,j)
Matrix.build(2){|k,l| (k==i && l==j)? 1 : 0}
end
(0..1).each do |i|
(0..1).each do |j|
eval("$e#{i}#{j}=e(i,j)")
end
end
p $e01 #=> Matrix[[0, 1], [0, 0]]
これで括弧を書かずに済むが,その分$を書くことになってしまった.