2010-04-09 22 views
16

Option là mặc nhiên chuyển đổi thành một Iterable - nhưng tại sao nó không chỉ là chỉ thực hiện Iterable trực tiếp:Tại sao Tùy chọn không mở rộng đặc điểm Iterable trực tiếp?

def iterator = new Iterator[A] { 
    var end = !isDefined 
    def next() = { 
    val n = if (end) throw new NoSuchElementException() else get 
    end = true 
    n 
    } 

    def hasNext = !end 
} 

EDIT:Trong thực tế nó thậm chí còn Weider hơn thế bởi vì trong 2,8 Option không khai báo một phương pháp iterator :

def iterator: Iterator[A] = 
    if (isEmpty) Iterator.empty else Iterator.single(this.get) 
+1

Bạn luôn có thể thay đổi mã nguồn và xem nội dung nào bị hỏng. :-) –

+0

Vâng, 'isEmpty' sẽ cần một công cụ sửa đổi' override' cho người mới bắt đầu! Tôi chỉ tự hỏi liệu đó có phải là một điều khái niệm không? –

+0

Tôi đoán đó là vì Tùy chọn là một đơn nguyên chứ không phải là một bộ sưu tập. Đối với tôi, có nghĩa là các bộ sưu tập có thể lặp lại, nhưng một đơn nguyên không phải là một bộ sưu tập ngay lập tức. Btw: Tôi không biết về Scala 2.7, nhưng trong 2.8 Option.iterator được thực hiện bằng cách sử dụng Iterator.empty và Iterator.single. –

Trả lời

9

Tôi nghĩ rằng có quá nhiều phương pháp không vô nghĩa sẽ được yêu cầu. Ví dụ, những gì bạn mong đợi giá trị trả về là cho:

Some(1) ++ Some(2) 

này hiện biên dịch và đánh giá để Liệt (1,2) qua implicits trong 2.8, nhưng có vẻ kỳ lạ.

Có lẽ đó là lý do tại sao các ý kiến ​​doc trong 2,7 nói:

Only potentially unbounded collections should directly sub-class Iterable 

Edit: Như đã trình bày trong @ MattR của bình luận dưới đây, tôi lại ra đề nghị doc-bình luận cho sub-type Bộ sưu tập được có khả năng gây nhầm lẫn . Và xem xét nó biến đổi câu hỏi này thành "Tại sao Option không mở rộng đặc điểm Collection?"

+2

Tài liệu nói, "Nếu một bộ sưu tập có kích thước đã biết, nó cũng phải loại phụ Bộ sưu tập. Chỉ những bộ sưu tập có khả năng không bị chặn mới nên trực tiếp phụ lớp Iterable". –

+0

@Matt - nếu bạn đăng câu trả lời đó, nó sẽ được chấp nhận! –

+0

@oxbow: Tôi không chắc nó nên! Câu hỏi sau đó chỉ hơi khác một chút: tại sao Option không phải là subtype Collection, mà là một "Biến thể của Iterable được sử dụng để mô tả các bộ sưu tập với một số hữu hạn các phần tử"? –

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