我有一个从
问题在于如何避免重复?我不太喜欢将
是的,我知道这里有多个类似的问题(例如这个和这个),但它们中每一个最多只包含部分解决方案。
JValue
中提取Int
的代码,它应该对多个JValue
子类完全相同,所以我试图避免重复。但是,如下所示,scala认为j
是泛型JValue
,并且j.values
返回类型为Values
的值,这显然没有isValidInt
和toInt
方法。jvalue \ name match {
case j @ (JInt | JDecimal | JDouble) => {
val num = j.values
if (num.isValidInt) num.toInt.success else reportError(name + " is not a valid int")
}
问题在于如何避免重复?我不太喜欢将
JValue
转换为字符串,因为这段代码处理的是刚从字符串解析成 AST 的 json。我开始考虑为我需要匹配的三种类型编写包装器,并从这些类型中隐式转换到包装器中,然后创建一个超类,专门用于这些包装器作为模式使用,但我不确定如何实现。是的,我知道这里有多个类似的问题(例如这个和这个),但它们中每一个最多只包含部分解决方案。
case JInt(i) => if (i.isValidInt) Some(i.toInt) else None //JInt's i is a BigInt
对于JDecimal和JDouble也是同样的代码,这正是我想要避免的。 - YarisValidInt
检查,这可能比您所述的更简洁。另一个问题:您使用的Json库是什么?\
语法看起来很熟悉,适用于lift-json
,它具有extractOpt[T]
方法,您可以使用该方法直接从任何JValue中提取Option[Int]
。 - Dylanextract[T]
方法。它可以将任何数字值转换为Int
(即extract[Int]
),唯一的问题是它不关心截断,例如 2.1 会在没有错误的情况下转换为 2。如果我要编写自己的要关心截断的Formats
,那么它将涉及与我们这里一样的程度的繁琐操作。 - Yar