重载现有的`toInt`方法
StringLike
中的toInt
方法不带任何参数,只能用十进制进行解析。 所以为了解析二进制,十六进制等,我们需要求助于Java的Integer#parseInt(String s, int radix)
。
为了弥补这种状况,我尝试了以下内容
implicit def strToToIntable(s: String) = new {
def toInt(n: Int) = Integer.parseInt(s, n)
}
然而,
"101".toInt(2)
导致REPL编译器“崩溃壮观”并且不能在编译的代码中工作。
使用“丰富我的图书馆”模式重载现有方法是否存在一些限制?
如果没有隐式,运行"101".toInt(2)
导致REPL告诉我Int没有参数。 所以我猜想现在发生的事情是它正在运行"101".toInt
,然后试图"101".toInt
apply(2)
,这是没有意义的。 我会建议你toInt
地重新命名,以避免这个问题。
编辑
我自己取得了一些成功。 我明确定义了一个pimped的字符串类
class StrToRadixInt(s:String) {
def toInt(radix: Int) = Integer.parseInt(s,radix)
}
implicit def strToToIntable(s:String) = new StrToRadixInt(s)
而且REPL很高兴:
scala> "101".toInt(2)
res4: Int = 5
REPL不应该崩溃 - 这是一个错误。 但即便如此,名字的重载也有些令人沮丧,在某些情况下也不被支持。 只需使用不同的名称:
implicit def parseBase(s: String) = new { def base(b: Int) = Integer.parseInt(s,b) }
scala> "10110" base 2
res1: Int = 22
链接地址: http://www.djcxy.com/p/55843.html
上一篇: Overloading the existing `toInt` method
下一篇: How to write custom serializer and deserializer in Jackson?