不,很难使请求失败:
def user(userId: Int) : Option[User] // is OK
def user(userId: Int) : Either[String,User] // is OK
def user(usedId: Int) : User // is not OK
或者你可以创建一个类型(一个概念)来封装一个 Integer 以确保它是一个有效的 UserId (在出生时)。
sealed case class UserId(u:Int) //extends AnyVal // If it's scala 2.10.0
object UserId {
def get(i:Int) : Option[UserId] = //some validation
} /// ....
def user(userId:UserId) : User //is OK // well it depends on the semantic of user destruction.
当你创建一个 def 时,你必须确保你的函数的域(this 和 args)和 codomain(result)之间存在正确的关系。
无论如何,不要犹豫输入(创建概念),它会帮助你推理你的代码。
为什么def user(userId: Int) :User
不行?
Integer
因为元素之间的关系User
不存在。如果 UserIds 都是正整数,但您要求,该user(-10)
怎么办?(这不会发生,对吧?)这个调用应该引发异常吗?还是返回 null ?
如果你认为它应该返回 null,然后返回一个 Option,它封装了潜在的缺失对应关系。
如果您认为它应该引发异常,则返回:
- 一个
Validation[SomethingRepresentingAnError, User]
(斯卡拉兹),
- 一个
Either[SomethingRepresentingAnError, User]
(scala 2.7, 2.8, 2.9)
- 或
Try[User]
(scala 2.10)
拥有丰富的返回类型将帮助您正确使用 API。
顺便说一句,Scala 不使用检查异常,因此您不能使用异常作为替代结果。应该为真正的异常行为保留异常(作为运行时异常)。
也可以看看 :
- http://www.scala-lang.org/api/current/index.html#scala.util.control.Exception$