トップ 最新 追記 RSS feed

継続にっき

2004|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|12|
2006|01|03|05|06|08|09|10|12|
2007|01|02|03|05|07|12|
2008|10|
2009|01|05|12|
2010|04|05|11|
2011|01|09|12|
2012|02|03|05|09|12|
2013|02|03|
2014|05|09|
2015|12|

2012-02-04 (Sat)

))) ScalaっぽいパターンマッチをRubyで実装する

例によって思いつきドリブン実装。var @ patternをpattern :: varで表現していることを除けば見た目はそれなりになった感がある、ような。

require 'match'

class EMail
  def self.unapply(value)
    value.to_s.split(/@/).tap {|parts| raise PatternNotMatchError.new unless parts.length == 2}
  end
end

match([1, "foo-bar@example.com"]) {
  pattern(Array.(i, EMail.(/(\w+)-(\w+)/.(firstname, 'bar') :: name, domain) :: mail)) {
    p [i, firstname, name, domain, mail] # => [1, "foo", "foo-bar", "example.com", "foo-bar@example.com"]
  }
}

パターンマッチは時々欲しくなるのでRuby 3.0あたりで言語仕様に取り込まれないかなぁと思うんだけど、あまりパターンマッチについて議論されているところを見た記憶がない。 Refinementsが入ればライブラリレベルでがんばれるようになるんだろうか。

追記(2012/03/03)

Ruby向けパターンマッチライブラリ「pattern-match」を作ったにてライブラリ化済み。


2004|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|12|
2006|01|03|05|06|08|09|10|12|
2007|01|02|03|05|07|12|
2008|10|
2009|01|05|12|
2010|04|05|11|
2011|01|09|12|
2012|02|03|05|09|12|
2013|02|03|
2014|05|09|
2015|12|
トップ 最新 追記 RSS feed