Ruby 言語内 DSL

ってなわけで、おもむろに「初めてのRuby」を手に取ったわけですが。

大分忘れてます^^;

解釈に少し時間がかかったので、メモしときます。P175

今までは、ただ何も考えず使うだけだったRakeとか便利な言語内DSL

その中身がどんなんかなんて考えたこともなかったです。

言語内DSLでは、どうやらコンテキストのすり替えを行うことで、目的の処理を実行しているようです。

dsl_1,dsl_2みたいな命令があったとしたら、DSL言語内部は多分こんな感じ

class TestDsl

  def dsl &prc
    self.instance_eval(&prc) 
  end

  def dsl_1
    p "dsl_1"
  end
  
  def dsl_2
    p "dsl_2" 
  end

end

このように書いとくと、以下のようにして呼べる

TestDsl.new.dsl do
 dsl_1
 dsl_2
end

#これを実行すると
# => "dsl_1"
# => "dsl_2" って出力される

分かってしまえば、当たり前のことなんだけど、ちゃんと理解できてなかった。
上記コードでは、dsl_1,dsl_2の呼び出しのレシーバは、TestDslのインスタンスになっている

通常ブロック呼び出しのところの文のレシーバは、mainになるんだけどここでは、

「self.instance_eval(&prc) 」

の部分で、評価コンテキストをTestDslにすり替えて実行している。


勉強足りないな〜。
とりあえず、これからの予定として
・gemの作り方を調べる
・rakeのソースリーディング
この二つをやっていこうかな。