たぶんRubyでは 〜 Maybeモナドに憧れて 〜
Posted by nanki Wed, 28 Oct 2009 05:25:00 GMT
HaskellにはMaybeモナドというのがあって、エラー処理をかなり適当な感じに書けてとても便利そう。
一方、多くのプログラミング言語では、
request.mobile && request.mobile.docomo?
File.open('example.txt').read rescue nil # これはすこし横着こういった記述を頻繁に使う必要があり、なんとかしたい。
そこで、
class Never
instance_methods.each do |v|
undef_method(v) unless %w(__id__ __send__).include?(v)
end
def method_missing(*args)
self
end
def end
nil
end
end
class Maybe < Never
def initialize(value)
@value = value
end
def method_missing(*args, &block)
Maybe.new @value.__send__(*args, &block)
rescue Exception
Never.new
end
def end
@value
end
end
class Object
def maybe
Maybe.new(block_given? ? yield : self)
rescue Exception
Never.new
end
end上のようなコードを実行すると、
request.mobile.maybe.docomo?.end # => true/false or nil
File.maybe.open("file_does_not_exist.txt").read.end # => nilこういう風に書く事ができるようになって幸せ。 途中のどこかで失敗すると、単にnilが返る。
このように、包んだオブジェクトのフリをするオブジェクトを使う手法はRailsでは多用されていて、読んでみると割と楽しい。ProxyObjectとか呼ぶらしい。
class Maybe < Never のあたりが、
子「お父さん、運動会絶対見に来てね」
父「絶対行くぞ」
一週間後
子「お父さん、運動会絶対見に来てね」
父「たぶん…」
というような会話を想像してしまって、とても人間的。
