LoginSignup
1
2

More than 5 years have passed since last update.

rubyで定数が上書きできないので引数を増やして分岐を入れてみた

Last updated at Posted at 2015-10-15

初心者なのでいろいろ分かっていませんが必要に迫られたので対応した記録を。
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

1
2
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2