다른 점은 첫 번째 문장이 다음과 같이 구문 분석된다는 것입니다.
scala> List(1,2,3).++(List(4,5))
res0: List[Int] = List(1, 2, 3, 4, 5)
두 번째 예는 다음과 같이 구문 분석됩니다.
scala> List(4,5).:::(List(1,2,3))
res1: List[Int] = List(1, 2, 3, 4, 5)
따라서 매크로를 사용하는 경우주의해야합니다.
또한 ++
두 목록에 대해 호출 :::
하지만 목록에서 목록으로 빌더를 갖는 암시 적 값을 요청하므로 더 많은 오버 헤드가 발생합니다. 그러나 마이크로 벤치 마크는 그러한 의미에서 유용한 것을 입증하지 못했습니다. 컴파일러가 그러한 호출을 최적화한다고 생각합니다.
예열 후 마이크로 벤치 마크.
scala>def time(a: => Unit): Long = { val t = System.currentTimeMillis; a; System.currentTimeMillis - t}
scala>def average(a: () => Long) = (for(i<-1 to 100) yield a()).sum/100
scala>average (() => time { (List[Int]() /: (1 to 1000)) { case (l, e) => l ++ List(e) } })
res1: Long = 46
scala>average (() => time { (List[Int]() /: (1 to 1000)) { case (l, e) => l ::: List(e ) } })
res2: Long = 46
Daniel C. Sobrai가 말했듯이을 사용하여 컬렉션의 모든 내용을 목록에 추가 할 수 ++
있지만 목록을 :::
연결하는 것만 가능합니다.
:::
과 같이 시작하는 모든 방법과 같은 접두사 연산자입니다.: