Một điểm khác là câu đầu tiên được phân tích cú pháp là:
scala> List(1,2,3).++(List(4,5))
res0: List[Int] = List(1, 2, 3, 4, 5)
Trong khi ví dụ thứ hai được phân tích cú pháp là:
scala> List(4,5).:::(List(1,2,3))
res1: List[Int] = List(1, 2, 3, 4, 5)
Vì vậy, nếu bạn đang sử dụng macro, bạn nên cẩn thận.
Bên cạnh đó, ++
đối với hai danh sách đang gọi :::
nhưng có nhiều chi phí hơn vì nó yêu cầu một giá trị ngầm định để có một người xây dựng từ Danh sách đến Danh sách. Nhưng microbenchmark không chứng minh được điều gì hữu ích theo nghĩa đó, tôi đoán rằng trình biên dịch tối ưu hóa các cuộc gọi như vậy.
Điểm chuẩn vi mô sau khi khởi động.
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
Như Daniel C. Sobrai đã nói, bạn có thể nối thêm nội dung của bất kỳ bộ sưu tập nào vào danh sách bằng cách sử dụng ++
, trong khi với :::
bạn chỉ có thể ghép các danh sách.
:::
là một toán tử tiền tố giống như tất cả các phương thức bắt đầu bằng: