既存の `toInt`メソッドのオーバーロード

StringLiketoInt メソッドは引数をとらず、10進数でしか解析できません。したがって、バイナリ、ヘキサなどを解析するには、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コンパイラが "驚異的にクラッシュする"ようになり、コンパイルされたコードでも動作しません。

「ライブラリを充実させる」パターンを使用して既存のメソッドをオーバーロードすることにはいくつかの制限がありますか?

7
@トーマス:私がREPLを墜落させるたびにupvoteを持っていれば、今は100000人の評判があるだろう。
追加された 著者 Kim Stebel,
あなたの新しいタグ、 "ポンピング" が適切ですか?
追加された 著者 Blender,
コンパイラクラッシュは決して悪いコードの結果ではなく、悪いコンパイラの場合にのみ発生します。つまり、バグはコンパイラにあります。 *コンパイラが本当にクラッシュしてはいけないが、コードが正しくない場合があります。
追加された 著者 Daniel C. Sobral,
REPLをクラッシュさせるための+1 :-)
追加された 著者 Tomasz Nurkiewicz,
@Blender:固定:)
追加された 著者 tenshi,

2 答え

暗黙のうちに "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
3
追加された
答えは上記のリンクにあるので、これを受け入れる
追加された 著者 Luigi Plinge,
スカラは暗黙的にメソッドのオーバーロードを容易にしたくないようです: stackoverflow.com/questions/4480250/… および stackoverflow.com/questions/4443783/…
追加された 著者 Dylan,
しかし、パラメータなしで toInt を呼び出すことはできません...
追加された 著者 Mark Jayxcela,

REPLはクラッシュするべきではありません - それはバグです。しかし、そうであっても、名前のオーバーロードはやや落ち込み、一部のコンテキストではサポートされません。別の名前を使用してください:

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

scala> "10110" base 2
res1: Int = 22
1
追加された