不确定我是否理解这个问题。但这是我的尝试:为什么不创建一个提取器?
object ValidBigInt {
def unapply(s: String): Option[Int] = {
val bi = BigInt(s)
if (bi.isValidInt) Some(bi.intValue) else None
}
}
val toInt: PartialFunction[String, Int] = {
case ValidBigInt(i) => i
}
另一种选择是(这可能会回答关于是否可以使用文字PartialFunction
以外的其他方式创建的问题):case
val toInt = new PartialFunction[String, Int] {
def isDefinedAt(s: String) = BigInt(s).isValidInt
def apply(s: String) = BigInt(s).intValue
}
然而,由于偏函数的想法是它只是部分定义的,所以最终你仍然会做多余的事情——你需要创建一个大 int 来测试它是否有效,然后在函数应用程序中创建大 int再次...
我在Github上看到了一个项目,它试图通过缓存isDefinedAt
. 如果你去基准测试,你会发现它比默认的 Scala 实现要慢:)
因此,如果您想绕过isDefinedAt
vs的双重性质apply
,您应该直接使用提供Option[Int]
as 结果的(完整)函数。