Не уверен, что понимаю вопрос. Но вот моя попытка: почему бы не создать экстрактор?
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
}
Однако, поскольку идея частичной функции заключается в том, что она определена только частично, в конце концов вы все равно будете делать избыточные вещи - вам нужно создать большое целое число, чтобы проверить, действительно ли оно, а затем в приложении функции вы создаете большое целое число. снова...
Я видел проект на Github, в котором пытались обойти это путем некоторого кэширования результатов из isDefinedAt
. . Если вы спуститесь к бенчмаркам, то увидите, что он оказался медленнее, чем дефолтная реализация Scala :)
Поэтому, если вы хотите обойти двойную природу isDefinedAt
по сравнению с apply
, вам следует сразу перейти к (полной) функции, которая в результате дает Option[Int]
.
person
0__
schedule
14.04.2011
orElse
и др.? - person Raphael   schedule 15.04.2011