TL;DR
Maybe や Result などのモナドを提供する Ruby の gem。エラーや例外の処理と、関数の連結を簡潔に書ける。
なぜ必要か
モナドを使うと、nil のチェックやエラー処理のために if/else を何重にも書かずに済む。
仕組み
主なモナドは次の 2 つである。
- Maybe:
nilかもしれない値を、Some(value)かNoneで包む。value_orで安全に値を取り出せる。ただしNoneは、どこでその値が生じたかの情報を持たない - Result(Either とも呼ぶ):
SuccessとFailureの 2 つの場合を持つ。Failure(:user_not_found)のように、失敗の理由を持たせられる
バージョン 1.0 からは do 記法に対応している。do 記法の中では、yield でモナドの値を取り出す。
例
どちらかの検索が Failure を返すと、そこで処理が止まり、その Failure が結果になる。
user = yield find_user(params[:user_id])
address = yield find_address(params[:address_id])
Success(user.update(address_id: address.id))