質問を理解しているかどうかわかりません。しかし、ここに私の試みがあります: エクストラクタを作成してみませんか?
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
}
もう1つのオプションは次のとおりです(そして、リテラルPartialFunction
以外で作成できるかどうかという質問に答えるかもしれません):case
val toInt = new PartialFunction[String, Int] {
def isDefinedAt(s: String) = BigInt(s).isValidInt
def apply(s: String) = BigInt(s).intValue
}
ただし、部分関数の考え方は部分的にしか定義されていないため、最終的には冗長なことを行うことになります.big intを作成して有効かどうかをテストし、関数アプリケーションでbig intを作成する必要があります.また...
からの結果をいくらかキャッシュすることで、これを回避しようとするプロジェクトをGithubで見ましたisDefinedAt
。ベンチマークに行くと、デフォルトの Scala 実装よりも遅いことがわかります:)
isDefinedAt
したがって、 vsの二重の性質を回避したい場合は、 as 結果apply
を提供する (完全な) 関数をそのまま使用する必要があります。Option[Int]