7

toIntin 方法不带任何参数,StringLike只能解析十进制。因此,要解析二进制、十六进制等,我们需要求助于 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 编译器“严重崩溃”并且在编译后的代码中也不起作用。

使用“丰富我的库”模式重载现有方法是否有一些限制?

4

2 回答 2

3

如果没有隐式,运行"101".toInt(2)会导致 REPL 告诉我 Int 不接受参数。所以我想正在发生的事情是它正在运行"101".toInt,然后试图调用apply(2)它,这是没有意义的。我建议对你的皮条客进行微妙的重命名toInt以避免这个问题。

编辑

我自己也取得了一些成功。我明确定义了一个拉皮条的字符串类

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
于 2011-10-27T20:05:54.757 回答
1

REPL 不应该崩溃——这是一个错误。但即便如此,名称的重载还是有点不鼓励,并且在某些情况下也不支持。只需使用不同的名称:

implicit def parseBase(s: String) = new { def base(b: Int) = Integer.parseInt(s,b) }

scala> "10110" base 2
res1: Int = 22
于 2011-10-27T23:03:03.120 回答