我想做这样的事情:
def parse[A: Numeric](str: String): A = {
if A =:= Int, str.toInt
if A =:= Float, str.toFloat
if A =:= BigInt, BigInt(str)
...
...
}
不幸的是,Numeric
特征中似乎没有定义fromString
。在 Scala 中实现此目的最惯用的方法是什么?
最佳答案
由于类型类的可扩展性,您所要求的通常是不可能的;您无法匹配 Numeric
的所有可能实现,因为任何用户定义的类型都可以实现它。同样,因此,不能保证每个 Numeric[A]
都可以从字符串中解析。
有两种解决方法。一种是部分解决方案,您确保只使用表示整数文字的字符串,然后使用 Int
的 fromString
来解析它和 Numeric
' s fromInt
进行转换。
另一种方式是在调用函数时传入实际的字符串解析函数。这有点像作弊,因为您的 parse
方法不再做任何实际工作,但可以通过隐式变得非常有用。
最直接的方法是添加一个(可能是隐式的)String -> A
参数(或者可能是 String -> Option[A]
以减少运行时错误) .实现此目的的另一种方法是转到 the typeclass route again and implement something like a Readable
typeclass .然后你可以让你的功能如下:
def parse[A: Numeric: Readable](x: String): A = ...
现在您只需要确保您对所有您关心的A
都有Readable[A]
实现。
关于Scala 从一个字符串创建一个数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35980321/