Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scala:用重载来拉皮条客我的库_Scala_Implicit - Fatal编程技术网

scala:用重载来拉皮条客我的库

scala:用重载来拉皮条客我的库,scala,implicit,Scala,Implicit,有什么想法吗?为什么下面的方法不起作用 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

有什么想法吗?为什么下面的方法不起作用

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) };
implicit def-listExtensions[A](xs:List[A])=新的listExtensions(xs)
类ListExtensions[A](xs:List[A])
{
def foreach[B](f:(A,Int)=>B)
{
var i=0;
对于(el-println(el,i)};
当我用FSC2.8.1编译它时,我得到了以下错误:“参数的数量错误;预期=1:a foreach{(el,I)=>println(el,I)};”。我是做错了什么,还是根本没有办法通过“pimp my library”技巧添加重载方法


另外,我不想用foreach的当前索引风格实现迭代(我知道zipWithIndex方法),而是关于重载和隐式转换是如何结合在一起的。

编译器从不尝试使用隐式转换,因为列表中已经有foreach方法。更具体地说,是Scala语言规范的第7.3节(http://www.scala-lang.org/docu/files/ScalaReference.pdf)声明隐式转换应用于两种情况,第二种情况与示例相关:

在类型为T的e的选择e.m中,如果选择器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

只有当您尝试使用源类型上不存在的方法时,隐式转换才会生效

在这种情况下,List有一个foreach方法,因此不会考虑转换。但是,如果与预期的签名不匹配,则会出现错误

(a : ListExtensions[Int]) foreach { (el, i) => println(el, i) };
或者,将名称更改为foreachWithIndex

可能重复的