u16suzuの blog

日々学んだことのメモブログです。

Rubyで設定系DSLを書いてみた

こちらのスライドを参考にしてRuby で設定系のDSLを書いてみました。

sixeight.hatenablog.com

ところどころ、コメントを書いて理解しながら書いてみました。

# 設定系DSL

class Awesome
  class Config
    attr_accessor :hoge, :fuga # (a)
    attr_accessor :method
  end

  def self.configure(&block)
    block.call(self.config) # (2). @config オブジェクトを引数にして ブロックを実行
    # call を省略してもOK
    # block.(self.config)
  end

  # (1). Config class の @config オブジェクトを生成する
  def self.config
    @config ||= Config.new
  end
end

Awesome.configure do |c| # (3). このブロック引数に @config が渡されている
  c.hoge = 123 # (4). @config オブジェクトの (a). で定義されている hoge に代入される
  c.fuga = 456
  c.method = lambda{ p "hi" } # (5). メソッドも設定ファイルないで指定できる
end

p Awesome.config.hoge
p Awesome.config.fuga
p Awesome.config.method
Awesome.config.method.call() # (6). (5)でlambdaとして保存したメソッドを実行

Railsを使っているとよく出てくる設定ファイルがどのような仕組みで成り立っているのか分からなくて 気持ち悪かったのですが、 これでスッキリしました。