簡體   English   中英

scala:pimp我的庫有重載

[英]scala: pimp my library with overloads

任何想法為什么沒有以下工作?

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:foreach {(el,i)=> println(el,i)};”。 我做錯了什么或者根本沒有辦法通過“皮條客我的圖書館”技巧添加重載方法?

PS我不知道如何實現foreach的iterate-with-current-index風格(我知道zipWithIndex方法),而是關於重載和隱式轉換如何一起使用。

編譯器從不嘗試使用隱式轉換,因為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

只有當您嘗試使用源類型中不存在的方法時,才會啟用隱式轉換。

在這種情況下,List有一個foreach方法,因此不會考慮轉換。 但是如果不匹配預期的簽名,您將收到錯誤。

(a : ListExtensions[Int]) foreach { (el, i) => println(el, i) };

或者,將名稱更改為foreachWithIndex

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM