Tbpgr Blog

Employee Experience Engineer tbpgr(てぃーびー) のブログ

メタプログラミングRuby | 魔術 | クリーンルーム

内容

ブロックを評価する環境としてオブジェクトのinstance_evalを利用します。
主にDSLで利用されます。

サンプル

RSpec風のDSLを作成してみます。
instance_evalをそのまま利用するとかっこ悪いので
エイリアスで偽装してみます。

# encoding: utf-8

class RSpec
  class << self
    alias spec instance_eval
    def describe(value, &block)
      puts value
      block.call
    end

    def it(value, &block)
      puts value
      block.call
    end
  end
end
R = RSpec

R.spec do
  puts "before describe"

  describe "describe" do
    puts "before it"

    it "it" do
      puts "after it"
      
    end
  end
end

出力

before describe
describe
before it
it
after it