読者です 読者をやめる 読者になる 読者になる

脳汁portal

アメリカ在住(だった)新米エンジニアがその日学んだIT知識を書き綴るブログ

[Ruby]Rubyの変数の名前に変数の中身を使う方法

ruby

な… 何を言っているのか わからねーと思うが 
おれも 何をどう表せばいいのか わからなかった…
頭がどうにかなりそうだった… メタプロだとか超スピードだとか
そんなチャチなもんじゃあ 断じてねえ
Rubyのもっと恐ろしいものの片鱗を 味わったぜ…
f:id:portaltan:20150703153650p:plain

つまり

  • Rubyの変数を宣言するときに、既に存在する変数の中身を展開して変数名にしたい時にどうすればいいかってことです。

最初に方法だけ書いておくと

" 方法その1"
eval("#{value name} = #{actual value}")

" 方法その2"
obj.instance_variable_set(#{value name}, #{actual value})

あ…ありのまま 今 起こった事コードにしておくぜ!

方法その1:evalで無理やり宣言する

require 'date'

" 変数宣言 "
day = Date.today.strftime("%Y%m%d") #==> "20150703"

" 変数の中身を使った変数宣言 "
eval("@zaiko_#{day} = 100")
  # ==> @zaiko_20150703 = 100 

" 確認 "
puts @zaiko_20150703 #===> 100

方法その2:instance_variable_setを使う

obj.instance_variable_set(name, val)

ref.xaio.jp

require 'date'

" 変数宣言 "
day = Date.today.strftime("%Y%m%d") #==> "20150703"

" 変数の中身を使った変数宣言 "
instance_variable_set("@zaiko_#{day}", 50)

" 確認 "
puts @zaiko_20150703  #===> 50

まとめ

方法的にはinstance_variable_setを使った方がいい気がしますが、そもそもこれを使わなきゃいけないって時点で結構イケてない状況なんじゃないかって気もします。。

一応class_variable_setもあります
class_variable_set (Module) - Rubyリファレンス