2012-10-15 3 views
0

에서 ::: 방법을 사용하려고합니다 (이 방법은 운영자입니까?). REPL에 두 개의 목록을 입력하고 무슨 일이 벌어지고 있는지보고 난 후에 지금 무엇을하는지 알았습니다. 그러나 ::: 메서드의 API 정의는 읽고 이해하기가 어려웠습니다. 나는 그것이 "돌려주는"것을 읽음으로써 만 "얻었습니다".List :: Scala API의 해석 방법은 무엇입니까?

def :::[B >: A](prefix: List[B]): List[B] 
    Adds the elements of a given list in front of this list. 
    prefix The list elements to prepend. 
    returns list resulting from the concatenation of the given list prefix and this list. 
    Example: List(1, 2) ::: List(3, 4) = List(3, 4).:::(List(1, 2)) = List(1, 2, 3, 4) 

특히이 부분의 의미는 [B >: A](prefix: List[B])입니다. 나는 메소드가 반환하는 것을 읽고 그것을 가지고 놀면서 메소드가 리턴하는 것을 이해할 수 있었다. 미래를 위해서, 저는 다른 방법으로 API를 읽고 모든 것을 이해하려고 노력하고 싶습니다. 그것이 내가이 질문을하는 이유입니다.

답변

1

두 답변이 모두 정확합니다. 당신은 A 현재 목록의 유형 매개 변수이며, B, 당신은 목록

자신 만의 정의를 시도 할 수 있습니다 당신은 아직 자신이없는 경우 :::

에 공급하고 목록의 형식 매개 변수임을 기억해야한다

class MyList[+A]{ 
    def :::[B >: A](prefix: MyList[B]): MyList[B] = new MyList[B]() 
    } 

    class Animal 
    class Dog extends Animal 
    class Pig extends Animal 
    class Rock 

그리고 지금 당신이 REPL에서 테스트 할 수 있습니다

scala> new MyList[Dog] 
res0: Test.AkkaTest.MyList[Test.AkkaTest.Dog] = [email protected] 

scala> new MyList[Pig] 
res1: Test.AkkaTest.MyList[Test.AkkaTest.Pig] = [email protected] 

scala> res0:::res1 
res2: Test.AkkaTest.MyList[Test.AkkaTest.Animal] = [email protected] 

scala> new MyList[Rock] 
res3: Test.AkkaTest.MyList[Test.AkkaTest.Rock] = [email protected] 

scala> res3:::res0 
res4: Test.AkkaTest.MyList[ScalaObject] = [email protected] 

scala> res0:::res3 
res5: Test.AkkaTest.MyList[ScalaObject] = [email protected] 

그래서 당신이 알고이 (가) ::: 두 개의 목록을 연결하고 그 제네릭 형식 첫 번째 공통되는 목록을 생성하는 이해한다 ncestor. 예를 들어 컴파일러를이 res0 res3의 경우 다음과 같은 않는 것을 생각할 수 있도록 유형 목록이 공변이기 때문입니다 :

  • A가 락 B는 개입니다, B는의 부모 클래스 아니다 어쩌면 컴파일러 오류가 발생합니다?
  • MyList는 공변 (covariant)하므로 MyList [Dog]는 MyList [ScalaObject]의 하위 클래스입니다.
  • 쿨, ScalaObject 락의 부모 클래스, 그래서 ScalaObject
+0

힘든 답변을 주신 모든 분들께 감사드립니다. 대단히 감사합니다, @ Edmondo1984. 나는 너의 것을 올바른 사람으로 선택하고 다른 사람들을 업보트 할 것이다. 봐, 그게 네가 한 것처럼 내가하고 싶은거야. 내 목록을 만들고 함께 재생 해보세요. – ilango

4

[B >: A]은 메소드가 일반적이고 A의 수퍼 유형이어야하는 B이라는 하나의 유형 인수를 취한다는 것을 의미합니다. (prefix : List[B])List[B] 유형의 prefix이라는 실제 인수를 취한다는 것을 의미합니다. 그것은이 def :::(prefix: List[A]): List[A] 기록 할 것이다 서브 타입이 아니었다 경우, [B >: A] 그냥 다음을 수행 할 수 있습니다

+0

아주 좋은 답변의 목록을 작성합니다. – ilango

2

, 말, List[Animal] 큰를 받고하는 List[Cat] 위에 List[Animal] 접두사.

+0

굉장합니다. 나는 그것을 이해하고 있으며 명확한 설명을 위해 너희들에게 감사하고있다. – ilango

관련 문제