我正在尝试编写以下函数而不使用var且只使用val。任何想法如何处理这个?
def isValidBSONId(id: String): Boolean = {
var valid: Boolean = false
import reactivemongo.bson.utils.Converters._
try {
str2Hex(id)
valid = true
} catch {
case _ => valid = false
}
valid
}
答案 0 :(得分:5)
在str2Hex(id)
中包含对Try
的调用,然后对Success
或Failure
案例类的结果进行模式匹配。您可以针对Success
案例返回true,或针对Failure
案例返回false。最好只返回Try
,这样调用代码就没有if else块,并且可以对组成更好的结果进行模式匹配。
def isValidBSONId(id: String): Boolean = {
import reactivemongo.bson.utils.Converters._
Try(str2Hex(id)) match {
case Success(s) => true
case Failure(e) => false
}
}
答案 1 :(得分:5)
只需Try{}.isSuccess
def isValidBSONId(id: String): Boolean = {
import reactivemongo.bson.utils.Converters._
Try(str2Hex(id)).isSuccess
}
答案 2 :(得分:3)
只是:
def isValidBSONId(id: String): Boolean = {
import reactivemongo.bson.utils.Converters._
try {
str2Hex(id)
true
} catch {
case _ => false
}
}
方法或函数中执行的最后一个表达式将成为其返回值。如果失败,您肯定会捕获特定的异常str2Hex
抛出,因为可能存在您不希望为此目的捕获的运行时错误。
使用Try
monad更加惯用,您可能会这样使用:
def checkBSONId(id: String): Try[String] = Try { str2Hex(id) }
然后你可以做各种有趣的monadic东西,如map
over或结果上的模式匹配。
答案 3 :(得分:0)
还要考虑
def isValidBSONId(id: String): Boolean =
Try(reactivemongo.bson.utils.Convertersstr2Hex(id)) toOption != None
如果Try(str2Hex(id))
触发了异常,则toOption
会传递None
,因此根据不等式,该方法将返回false
,否则该方法将返回true
。< / p>