初心者なのでいろいろ分かっていませんが必要に迫られたので対応した記録を。
rubyもできるphperの人に聞いたら定数は普通上書きできないけどrubyではがんばればできるらしいスゲー変わってんな、ということでした。
でも私には難しすぎて良くわからなかったのと今回のケースでは無理そげな気がしたので正攻法(たぶん)でいくことにしました。
元の処理(イメージです)
SUBNET = {
'env1' => ['10.0.0.0/17'],
'env2' => ['10.1.32.0/19'],
}
def sg(env)
proc {
p *SUBNET[env]
}
end
sg('env2').call
単体テストにつかったスクリプトはこちら。
vi /tmp/istest.rb
------
SUBNET = {
'env1' => ['10.0.0.0/17'],
'env2' => ['10.1.32.0/19'],
}
OLDSUBNET = {
'env2' => ['10.2.128.0/20'],
}
def sg(env,*vpc)
proc {
if vpc[0] == 'oldvpc'
p *OLDSUBNET[env]
else
p *SUBNET[env]
end
}
end
sg('env2','oldvpc').call
#sg('env2').call
-------
# ruby /tmp/istest.rb
"10.2.128.0/20"
今回わかったことなど
・procで指定してるブロックをcallで呼んでる
・定数はcallしてる側から上書きできない(rubyは例外もあるらしいけど)
・定数を変えるのは諦めてdefで定義してる側に引数増やしてそれに応じて分岐を入れることにした
・引数を複数指定する場合にデフォルト値や配列指定以外の方法で引数の数が定義する側と呼ぶ側で合わないとエラーになる
・引数のデフォルト値を指定するやりかただとcallしてる側で上書きできないケースがあった
・引数を増やして渡す時に*がついてると配列で渡る。そして引数が含まれてなくても空の値が渡るので引数の数が合わないエラーが出ないっぽい、ので配列にした。
rubyまだあんまりよくわかんないままですけど(ググるとむずかしいのばっかりでてくる)
まあなんか動いたのでよかったなーと思いました。精進しないとですね。
参考:
「Ruby逆引きハンドブック」ほかいろいろ
以下よくわかってないやつ
https://hydrocul.github.io/wiki/programming_languages_diff/function/var-args.html
http://melborne.github.io/2014/04/28/proc-is-the-path-to-understand-ruby/
http://takitake.hatenablog.com/entry/2014/10/15/215007
http://akkunchoi.github.io/ruby-metaprogramming1.html
http://d.hatena.ne.jp/vaaaan/20090727/1248690914