Scala从字符串创建数字

时间:2016-03-14 05:46:27

标签: scala

我想做这样的事情:

def parse[A: Numeric](str: String): A = {
   if A =:= Int, str.toInt
   if A =:= Float, str.toFloat
   if A =:= BigInt, BigInt(str)
   ...
   ...
}

不幸的是,似乎fromString特征中没有定义Numeric。在Scala中实现这一目标的最惯用方法是什么?

1 个答案:

答案 0 :(得分:1)

你所要求的通常不可能通过类型的可扩展性来实现;没有办法可以匹配Numeric的所有可能实现,因为任何用户定义的类型都可以实现它。同样正因为如此,并不能保证每个Numeric[A]都可以从字符串中解析。

有两种方法可以解决这个问题。一个是部分解决方案,您确保只使用表示整数文字的字符串,然后使用Int' s fromString来解析它和Numeric' s {{ 1}}转换它。

另一种方法是在调用函数时传入实际的字符串解析函数。这可能有点像作弊,因为你的fromInt方法不再有任何实际工作,但可以使用非常有用。

最直接的方法是添加一个(可能是隐式的)parse参数(或者可能String -> A以减少运行时错误)。实现这一目标的另一种方法是去the typeclass route again and implement something like a Readable typeclass。然后你可以让你的功能如下:

String -> Option[A]

现在您只需要确保为您关注的所有def parse[A: Numeric: Readable](x: String): A = ... 实施Readable[A]