7

toIntメソッドはStringLike引数を取らず、10 進数でのみ解析できます。そのため、バイナリ、16 進などを解析するには、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コンパイラが「見事にクラッシュ」し、コンパイルされたコードでも機能しません。

「enrich my library」パターンを使用して既存のメソッドをオーバーロードする際に制限はありますか?

4

2 に答える 2

3

暗黙的に実行しない"101".toInt(2)と、REPLはIntがパラメーターを受け取らないことを通知します。だから私は何が起こっているのかはそれが実行されていることであり"101".toInt、それからそれを呼び出そうとしていると思いますapply(2)が、それは意味がありません。toInt問題を回避するために、pimpedの微妙な名前を変更することをお勧めします。

編集

私はちょうど自分自身のいくつかの成功を収めました。私は明示的に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
于 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 に答える