2011-10-27 7 views
7

StringLiketoIntメソッドは引数をとらず、10進数でしか解析できません。したがってバイナリ、16進数などを解析するには、JavaのInteger#parseInt(String s, int radix)に頼る必要があります。このような状況を改善する試みにおいて既存の `toInt`メソッドのオーバーロード

は、私はしかし、

"101".toInt(2) 

はREPLコンパイラが「見事クラッシュ」の原因とコンパイルでは動作しません、次の

implicit def strToToIntable(s: String) = new { 
    def toInt(n: Int) = Integer.parseInt(s, n) 
} 

を試してみましたコード。

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

+1

新しいタグ["pimping"](http://en.wikipedia.org/wiki/Pimping)は適切ですか? – Blender

+5

+1をクラッシュさせるための+1 :-) –

+0

@Blender:fixed :) – tenshi

答えて

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 
+1

しかし、パラメータなしで 'toInt'を呼び出すことはできません... –

+4

スカラは暗黙的にメソッドをオーバーロードしたくないようです:http://stackoverflow.com/questions/4480250/scala-pimp-my- library-with-overloadsとhttp://stackoverflow.com/questions/4443783/overriding-arithmetic-operators-on-int-via-implicit-conversions – Dylan

+0

答えは上記のリンクにあるので、これを受け入れる –

1

REPLがクラッシュしてはならない - それはバグです。しかし、そうであっても、名前のオーバーロードはやや落ち込み、一部のコンテキストではサポートされません。

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

scala> "10110" base 2 
res1: Int = 22 
関連する問題