2010-12-18 77 views
2

任何想法爲什麼以下不工作?scala:皮條客我的圖書館有超載

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)} ;」。我做錯了什麼或者根本沒有辦法通過「pimp my library」技巧來添加重載方法?

P.S.我不知道如何實現foreach的iterate-current-index風格(我知道zipWithIndex方法),而是關於重載和隱式轉換如何共同發揮作用。

+0

可能重複(http://stackoverflow.com/questions/4443783/overriding-arithmetic-operators-on -INT-經由隱-轉化) – 2010-12-19 09:20:10

回答

10

編譯器從不嘗試使用隱式轉換,因爲List上已經有了一個foreach方法。更具體地說,Scala語言規範的第7.3節(http://www.scala-lang.org/docu/files/ScalaReference.pdf)指出,隱式轉換適用於兩種情況,第二種情況與示例相關:

In a selection e.m with e of type T, if the selector m does not denote a member of 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 
1

隱式轉換隻會在嘗試使用源類型中不存在的方法時觸發。

在這種情況下,List有一個foreach方法,所以不會考慮轉換。但是你會因爲不符合預期的簽名而出錯。

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

或者,將名稱改爲foreachWithIndex [經由隱式轉換的詮釋重寫算術運算符]的