はじめに
N予備校で「Scala応用」コースを受講しています。
Either
Option
型の場合、エラーの種類までは取得できない。
2つの値のどちらかを表現するデータ型。
Left
にはエラー、Right
には正常の値を入れる。
sealed trait LoginError
case object InvalidPassword extends LoginError
case object UserNotFound extends LoginError
case object PasswordLocked extends LoginError
case class User(id: Long, name: String, password: String)
object LoginService {
def login(name: String, password: String): Either[LoginError, User] = {
(name, password) match {
case ("taro", "Password1") => Right(User(1, name, password))
case ("taro", _) => Left(InvalidPassword)
case (_, _) => Left(UserNotFound)
}
}
}
呼び出し
LoginService.login(name = "taro", password = "Password1") match {
case Right(user) => println(s"id: ${user.id}")
case Left(InvalidPassword) => println(s"Invalid Password!")
case Left(UserNotFound) => println(s"User Not Found!")
case Left(PasswordLocked) => println(s"Password Locked!")
}
Try
Success
とFailure
の2つのデータ型を持つ。
import java.lang.Runtime
import scala.util.{Failure, Success, Try}
object TryTest {
def isCat(animal: String): Boolean = {
Try {
if (animal == "Cat")
true
else {
throw new Exception
false
}
} match {
case Success(_) =>
println("ねこだよ")
true
case Failure(_) =>
println("ねこじゃないよ")
false
}
}
}
Try
で引っかかる例外はNoFatal
なものだけ。
引数にString
以外のものを入れてもFailure
に入るわけじゃない。
まとめ
使い分けとして、
Nullを使う場合 => Option
Optionでは情報が不足している、エラー状態が定義されている => Either
例外を値として扱いたい場合 => Try
が目安になるみたい。