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。相反,它的意思是“使用参数列表中的下一个参数”或“将此方法转换为函数对象”,具体取决于上下文。在您的情况下,第二个是无稽之谈,因为您想要一个变量的函数但使用_了三次。

提示:使用xt。拼写tuple不太可能对任何人都有帮助,并且单字母版本与_. 更好的是,

filter { case (t,i) => (i==0) || (t != list(i-1)) }
于 2012-07-23T06:30:56.663 回答
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)) }
}

编译器正确地拒绝为荒谬。包含的调用_围绕该调用扩展为 lambda,仅此而已。

于 2012-07-23T06:32:43.933 回答