Heppoko Binbo Yarou no Newbie Nikki

旧題: へっぽこびんぼう野郎のnewbie日記 #vZkt8fc6J

RSpecの `expec(x).to eq y` の構文が謎かったので実装してみた

動機

RubyとかRuby on Railsとかの勉強をしてたらRSpecのところで少しハマったので調べてみた。

実装

class Expect
  def initialize(trying)
    @trying = trying
  end

  def to(wrapper)
    if wrapper.call @trying
      puts 'OK!!'
    else
      puts 'NG!!'
    end
  end
end

def eq expected
  lambda do |x|
    x == expected
  end
end

def expect trying
  Expect.new trying
end

expect(1 + 2).to eq 3
(expect 1 + 2).to(eq(3))

本来の実装方法はわからないけど、普通に高階関数を使っているだけのようだ。DSLだと実装者は大変だけど使う側は考えなくても使えるようになっていて便利だなとおもった。慣習的なイディオムが expect(1 + 2).to eq 3 となっているので、別に違う書き方でもいいのだなとおもった。

(調べたら実際の実装は割とちがうらしいので、そのうち暇ができたら調べてみる)

Pythonと似ているけど、根本的な思想が結構違うのでおもしろい