range_dsl
RubyのRangeだけではちょっと面倒な部分を簡単に書けるようなDSLを作ってみました。
http://github.com/akm/range_dsl/
作った動機
数値の範囲を示すRangeオブジェクトを幾つか作ったり、どこからか取得できるような仕組みを作っておいて、合致した条件オブジェクトに対して関係するデータだけ処理したい。
ただし条件は単なるRangeや数値として表現できるものもあれば、and/orなどで結合した条件もあったり、Rangeのリテラルでは表現できない正/負の無限大を末端とする場合もある。
このような場合に、Rangeオブジェクトの代わりに以下のように書きたい
gte(100) # greater_than_equal lt(20) # less_than eq(3) # equal neq(4) # not_equal
以下のように結合する場合も必要
gte(3) & lte(7) # 3以上7以下 gte(3).and lte(7) # 同上 lte(3) | gte(7) # 3以下あるいは7以上
インストール方法
$ (sudo) gem install range_dsl
使い方
以下irbで
require 'rubygems' require 'range_dsl' include RangeDsl r1 = gte(3) & lt(10) #=> gte(3) & lt(10) r2 = r1 | any(11, 13, 15) #=> gte(3) & lt(10) | any(11, 13, 15) r = any(1, 2) | gte(5) r.include?(0) # => false r.include?(1) # => true r.include?(2) # => true r.include?(3) # => false r.include?(4) # => false r.include?(5) # => true
specもちゃんと書いてるので、よかったら見てやってくださいまし。
http://github.com/akm/range_dsl/blob/master/spec/range_dsl_spec.rb