T

Lokkaでスタティックな変数みたいなものを

Lokkaのプラグインを作成していて、スタティックな変数が欲しいなあと思った。

例えば、メニューのリストがあって、複数のプラグインからリストに値を追加したい場合。というとややこしいので、

class Menu
  @menu_list = []
  def self.menu_list=(name)
    @menu_list << name
  end

 def self.menu_list
    @menu_list
  end
end

Menu.menu_list = 'hoge'
p Menu.menu_list #=> ["hoge"]
Menu.menu_list = 'fuga'
p Menu.menu_list #=> ["hoge", "fuga"]

普通のRubyのプログラムであればこんな感じになるケース。

SinatraをベースにしたLokkaの場合、プラグインとgetなどのアクセスできるスコープが異なる箇所にインスタンス変数やクラス変数を使うとしたら、configのsetを利用するのが手っ取り早い。

configure do
  set :foo => :bar
end

get '/hoge' do
  "#{settings.foo}" #=> "bar"
end

単純な値であればこれで事足りるわけだが、例えば複数のスコープになってしまう箇所でこの変数(例えば配列)に値を追加していきたい、なんて場合はconfigureのブロック内で

configure do
  My_Struct = OpenStruct.new(:list => [])
  set :menu_list => Proc.new{|menu| My_Struct.list << menu unless My_Struct.list.include? menu}
end

としておいて、

before do
  settings.menu_list 'もんじゃ焼き'
end

get '/hoge' do
  settings.menu_list 'たこ焼き'
  My_Struct.list.each do |menu|
    "#{menu}" # => 'もんじゃ焼き'と'たこ焼き'
  end
end

とやれば、スタティック変数みたいに扱うことができる。以上。

Posted by on 1月 15, 2011 in Ruby,

コメントを残す