2013-01-14 39 views
6

tôi đang tìm kiếm tại nguồn của tập tin RedBlackTree và tôi stumbled khi định nghĩa cho Tree, phần có liên quan trong đó tôi đã sao chép ở đây:Scala RedBlackTree cú pháp

sealed abstract class Tree[A, +B](
@(inline @getter) final val key: A, 
@(inline @getter) final val value: B, 
@(inline @getter) final val left: Tree[A, B], 
@(inline @getter) final val right: Tree[A, B]) 

Tôi có 2 câu hỏi:

  1. Làm thế nào để @(inline @getter) so sánh với @inline @getter?
  2. Tại sao val có đủ điều kiện với final? (Không phải là final dư thừa trong bối cảnh này?)

Trả lời

8

Cú pháp @(inline @getter) là một ví dụ về một chú thích meta, mà nói với trình biên dịch rằng @inline chú thích nên được đặt vào phương pháp getter tạo (như trái ngược với constructer tham số, đây sẽ là mặc định tại đây): meta annotations

Đánh dấu trường được tạo ra và getter là cuối cùng, vì vậy chúng không thể bị ghi đè bởi lớp con. Sự kết hợp đặc biệt này được sử dụng ở đây để lừa trình biên dịch Scala truy cập trực tiếp vào các trường của Tree trường hợp, thay vì gọi getters và dựa vào trình tối ưu hóa JVM để thực hiện nội tuyến thích hợp. Thật không may Scala không cung cấp một cách chính thức hỗ trợ để sử dụng trực tiếp các lĩnh vực.

Khi cây redblack được tối ưu hóa cho Scala 2.10, điều này cho hiệu suất tốt nhất. Xem TreeMap/TreeSet pull request bất biến để biết chi tiết đẫm máu.

+0

Tôi đã đọc một số yêu cầu kéo, nhưng tôi chưa bao giờ nhận thấy ở trên trước đây, cảm ơn bạn đã popping để giải thích! –

Các vấn đề liên quan