2010-12-18 4 views
2

다음과 같은 아이디어가없는 이유는 무엇입니까? 내가 FSC 2.8.1와이를 컴파일 할 때스칼라 : 포주 내 라이브러리 과부하

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) }; 

는, 나는 다음과 같은 오류 얻을 : "매개 변수의 잘못된 수 = 1 예상 : foreach는 {(엘, I) =>에 println (엘, i)를} ; " 내가 잘못한 일을하고 있거나 단순히 "포주 라이브러리"트릭으로 오버로드 된 메서드를 추가 할 수있는 방법이 없습니까?

P. foreach (현재 zipWithIndex 메서드를 알고 있음)의 iterate-with-current-index 특성을 구현하는 것이 아니라 오히려 오버로드 및 암시 적 변환이 함께 수행되는 방식에 대해 궁금합니다.

+0

가능한 중복 foreachWithIndex하는 이름을 변경 http://stackoverflow.com/questions/4443783/overriding-arithmetic-operators-on -int-via-implicit-conversions) –

답변

10

목록에 이미 foreach 메서드가 있으므로 컴파일러에서 절대 암시 적 변환을 사용하지 않습니다. 보다 구체적으로, 스칼라 언어 규격 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

암시 적 변환은 소스 유형에 존재하지 않는 메서드를 사용하려고 시도 할 때만 시작됩니다.

목록에는 foreach 메서드가 있으므로 변환은 고려되지 않습니다. 그러나 예상되는 서명과 일치하지 않으면 오류가 발생합니다.

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

또는 ([암시 적 변환을 통해 지능에 연산기 재정]의