2013-04-14 1 views
3

클래스 SeqLike.scala에는 시퀀스를 역순으로 바꾸는 reverse이라는 함수가 있습니다. 예를 들어이 소스에서 목록 (4,3,2,1)역 구현 Seq

`에 List(1,2,3,4)하게, 설명은 다음과 같습니다

def reverse: Repr = { 
var xs: List[A] = List() //Line 1 
for (x <- this) 
    xs = x :: xs 
val b = newBuilder ////Line 4 
b.sizeHint(this) 
for (x <- xs) 
    b += x 
b.result 
} 

는 내가 이해 해달라고하는 것은 : 라인 (1-3) 않습니다 작업. 그런데 왜 새로운 빌더를 만든 다음 리턴 할 요소를 추가할까요? Just Line [1-3]으로 충분합니다.

답변

6

줄 1-3은 List을 생성합니다. 그러나 reverse은 이전 Seq을 반환하지 않지만 동일 유형의 Seq을 반환해야합니다. 따라서 실제로 목록 일 경우 추가 빌더 단계가 필요하지 않습니다. 그렇지 않으면 그렇지 않습니다. (List의 구현을 보면 추가 작업을 수행하지 않습니다.)

override def reverse: List[A] = { 
    var result: List[A] = Nil 
    var these = this 
    while (!these.isEmpty) { 
    result = these.head :: result 
    these = these.tail 
    } 
    result 
}