scala:用重载来修饰我的库

2024-04-28

有什么想法为什么以下不起作用?

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) };”。我是否做错了什么,或者根本没有办法通过“拉皮条我的库”技巧来添加重载方法?

附:我不知道如何实现 foreach 的 iterate-with-current-index 风格(我知道 zipWithIndex 方法),而是想知道重载和隐式转换如何一起发挥作用。


编译器永远不会尝试使用隐式转换,因为 List 上已经有一个 foreach 方法。更具体地说,Scala 语言规范 (http://www.scala-lang.org/docu/files/ScalaReference.pdf) 的第 7.3 节指出,隐式转换应用于两种情况,第二种情况与示例相关:

在 e 类型为 T 的选择 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

scala:用重载来修饰我的库 的相关文章

随机推荐