Не уверен, что понимаю вопрос. Но вот моя попытка: почему бы не создать экстрактор?
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 ...
Я видел проект на Github , который пытался обойти это, несколько кешируя результаты isDefinedAt
. Если вы перейдете к тестам, вы увидите, что он оказался медленнее, чем стандартная реализация Scala:)
Так что, если вы хотите обойти двойную природу isDefinedAt
против apply
, вы должны просто перейти к (полной) функции, которая обеспечивает Option[Int]
в качестве результата.