2

次のことがうまくいかない理由はありますか?

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) };

これを fsc 2.8.1 でコンパイルすると、次のエラーが表示されます:「パラメーターの数が間違っています。予期される = 1: a foreach { (el, i) => println(el, i) };」。私は何か間違ったことをしているのですか、それとも単に「私のライブラリをポン引きする」トリックによってオーバーロードされたメソッドを追加する方法がありませんか?

PS foreach の iterate-with-current-index フレーバーの実装についてではなく (zipWithIndex メソッドを認識しています)、オーバーロードと暗黙の変換がどのように連携するかについて疑問に思います。

4

3 に答える 3

10

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

タイプ T の e を含む選択 em で、セレクター m が 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
于 2010-12-18T21:37:08.263 に答える
1
(a : ListExtensions[Int]) foreach { (el, i) => println(el, i) };

または、名前を foreachWithIndex に変更します

于 2010-12-19T07:07:54.507 に答える
1

ソース型に存在しないメソッドを使用しようとした場合にのみ、暗黙的な変換が開始されます。

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

于 2010-12-18T21:41:23.690 に答える