重载现有的`toInt`方法

时间:2011-10-27 19:29:58

标签: scala overloading enrich-my-library

toInt中的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编译器“崩溃”并且在编译的代码中也不起作用。

使用“rich my library”模式重载现有方法是否存在一些限制?

2 个答案:

答案 0 :(得分:3)

没有隐式,运行"101".toInt(2)会导致REPL告诉我Int不接受参数。所以我猜测正在发生的事情是它正在运行"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

答案 1 :(得分:1)

REPL不应该崩溃 - 这是一个错误。但即便如此,在一些情况下也不鼓励过度使用名称,也不支持。只需使用其他名称:

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

scala> "10110" base 2
res1: Int = 22