3

したがって、これはコンパイルされます:

def compress[T](list: List[T]): List[(T, Int)] =
{
    list.zipWithIndex.filter { tuple => (tuple._2 == 0) || (tuple._1 != list(tuple._2 - 1)) }
}

これはコンパイルされません:

def compress[T](list: List[T]): List[(T, Int)] =
{
    list.zipWithIndex.filter { (_._2 == 0) || (_._1 != list(_._2 - 1)) }
}

なんで?

4

2 に答える 2

14

_という意味ではありませんx。代わりに、コンテキストに応じて、「パラメーター リストの次のパラメーターを使用する」または「このメソッドを関数オブジェクトに変換する」ことを意味します。あなたの場合、1つの変数の関数が必要ですが、_3回使用するため、2番目のものはナンセンスです。

ヒント:xまたはを使用しますt。スペルアウトtupleは誰の助けにもなりそうになく、1 文字のバージョンは と同じくらいコンパクト_です。さらに良いことに、

filter { case (t,i) => (i==0) || (t != list(i-1)) }
于 2012-07-23T06:30:56.663 に答える
2

2 番目の例は次のように展開されます。

def compress[T](list: List[T]): List[(T, Int)] =
{
    list.zipWithIndex.filter { ((x => x._2) == 0) || ((y => y._1) != list((z => z._2) - 1)) }
}

コンパイラはこれを無意味なものとして正しく拒否します。call を含む呼び出しは、その call だけを_囲むラムダに展開され、他には何も展開されません。

于 2012-07-23T06:32:43.933 に答える