任何想法为什么没有以下工作?
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) };
Run Code Online (Sandbox Code Playgroud)
当我用fsc 2.8.1编译它时,我得到以下错误:"错误的参数数量;期望= 1:foreach {(el,i)=> println(el,i)};".我做错了什么或者根本没有办法通过"皮条客我的图书馆"技巧添加重载方法?
PS我不知道如何实现foreach的iterate-with-current-index风格(我知道zipWithIndex方法),而是关于重载和隐式转换如何一起使用.
mpi*_*ist 10
编译器从不尝试使用隐式转换,因为List上已有foreach方法.更具体地说,Scala语言规范(http://www.scala-lang.org/docu/files/ScalaReference.pdf)的第7.3节规定在两种情况下应用隐式转换,第二种情况与示例相关:
在具有类型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
Run Code Online (Sandbox Code Playgroud)