2010-12-18 4 views
2

なぜ以下の作品はありませんか?私はFSC 2.8.1でこれをコンパイルすると、私は次のエラーを取得するscala:pimp私のライブラリoverloads

implicit def listExtensions[A](xs : List[A]) = new ListExtensions(xs) 
class ListExtensions[A](xs : List[A]) 
{ 
    def foreach[B](f: (A, Int) => B) 
    { 
     var i = 0; 
     for (el <- xs) 
     { 
      f(el, i); 
      i += 1; 
     } 
    } 
} 

var a = List(1, 2, 3); 
a foreach { (el, i) => println(el, i) }; 

「パラメータの間違った数; = 1期待:foreachの{(EL、I)=>のprintln(EL、I)} ; "私は間違ったことをやっているのですか、単に "私のライブラリを抱きしめる"という手段でオーバーロードされたメソッドを追加する方法はありませんか?

P.S.私は、foreachのiterate-with-current-indexの風味(私はzipWithIndexメソッドに気づいています)を実装するのではなく、オーバーロードと暗黙的な変換がどのように一緒に働くかについては不思議です。

+0

[暗黙的な変換を介してのIntに算術演算子を上書き]の可能な重複(http://stackoverflow.com/questions/4443783/overriding-arithmetic-operators-on -int-via-implicit-conversions) –

答えて

10

リストにforeachメソッドがすでに存在するため、コンパイラは暗黙の変換を使用しようとしません。より具体的には、Scala言語仕様のセクション7.3(http://www.scala-lang.org/docu/files/ScalaReference.pdf)では、2つのケースで暗黙的な変換が適用され、2番目のケースはこのサンプルに関連しています:余談として

In a selection e.m with e of type T, if the selector m does not denote a member of T.

、あなたはzipWithIndexメソッドを使用して、インデックス付きのforeachを達成することができます。

scala> val a = List("Java", "Scala", "Groovy") 
a: List[java.lang.String] = List(Java, Scala, Groovy) 

scala> a.zipWithIndex.foreach { case (el, idx) => println(el + " at index " + idx) } 
Java at index 0 
Scala at index 1 
Groovy at index 2 
1

暗黙の変換は、ソースの種類に存在しないメソッドを使用しようとすると発生します。

この場合、Listにはforeachメソッドがあるため、変換は考慮されません。しかし、期待される署名と一致しないためにエラーが発生します。

1
(a : ListExtensions[Int]) foreach { (el, i) => println(el, i) }; 

あるいは、foreachWithIndex

に名前を変更
関連する問題