gpt4 book ai didi

scala - 使用 Scala 提取器将字符串转换为 Int

转载 作者:行者123 更新时间:2023-12-02 22:14:01 24 4
gpt4 key购买 nike

我正在尝试使用提取器将 String 转换为 Int。我的代码如下所示。

object Apply {
def unapply(s: String): Option[Int] = try {
Some(s.toInt)
} catch {
case _: java.lang.Exception => None
}
}

object App {
def toT[T](s: AnyRef): Option[T] = s match {
case v: T => Some(v)
case _ => None
}
def foo(param: String): Int = {
//reads a Map[String,String] m at runtime
toT[Int](m("offset")).getOrElse(0)
}
}

我收到一个运行时错误:java.lang.String cannot be cast to java.lang.Integer。似乎提取器根本没有被使用。我该怎么办?

编辑:我的用例如下。我正在使用 play,我想解析在 url 中传递的查询字符串。我想获取查询字符串值 (String) 并将其用作 Int、Double 等。例如,

val offset = getQueryStringAs[Int]("offset").getOrElse(0)

最佳答案

我认为这里最大的问题是,您似乎混淆了转换和转换。您有一个 Map[String, String],因此您不能将值转换为 Int。你必须转换它们。幸运的是,Scala 通过隐式转换为 StringOps 将 toInt 方法添加到字符串。

这应该适合你:

m("offset").toInt

请注意,如果字符串无法转换为整数,toInt 将抛出一个 java.lang.NumberFormatException

编辑:

你想要的 afaik 只适用于类型类。

这是一个例子:

trait StringConverter[A] {
def convert(x: String): A
}

implicit object StringToInt extends StringConverter[Int] {
def convert(x: String): Int = x.toInt
}

implicit object StringToDouble extends StringConverter[Double] {
def convert(x: String): Double = x.toDouble
}

implicit def string2StringConversion(x: String) = new {
def toT[A](implicit ev: StringConverter[A]) = ev.convert(x)
}

用法:

scala> "0.".toT[Double]
res6: Double = 0.0

关于scala - 使用 Scala 提取器将字符串转换为 Int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14791861/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com