2010-04-09 13 views
16

Option bir Iterable örtük olarak dönüştürülebilir - ama neden sadece sadece doğrudan Iterable uygulamıyor:Neden Seçenek, yinelenen özelliği doğrudan genişletmiyor?

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 
} 

DÜZENLEME: bundan bile weider var Aslında 2.8 Option bir iterator yöntem bildirmek çünkü :

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

Kaynak kodunu her zaman değiştirebilir ve ne tür kesmeler olduğunu görebilirsiniz. :-) –

+0

Eh, 'isEmpty 'başlatıcılar için bir' geçersiz kılma 'değiştirici gerekir! Ben sadece bunun kavramsal bir şey olup olmadığını merak ettim –

+0

Bunun sebebi Option'un bir monad ve koleksiyon olmadığı içindir. Bana göre koleksiyonların yinelenebilir olduğu anlaşılıyor, ancak bir monad hemen bir koleksiyon değil. Btw: Scala 2.7 hakkında bilmiyorum, ancak 2.8 Option.iterator'da Iterator.empty ve Iterator.single kullanılarak uygulanır. –

cevap

9

Gerekli olmayan çok fazla anlamsız yöntem olduğunu düşünüyorum. Bu, şu anda derler ve 2.8'de implicits yoluyla (1,2) Listeye değerlendirir, ancak tuhaf

Some(1) ++ Some(2) 

: için Örneğin, dönüş değeri ne beklenebilir.

Only potentially unbounded collections should directly sub-class Iterable 

Düzenleme:: Aşağıdaki @ MattR yorumuna gösterildiği gibi, beni alt türü Koleksiyonu doc-comment öneri dışarıda bırakarak potansiyel yanıltıcıdır

Belki bu 2.7'de doc yorumlar söyle neden . Ve bu soruyu düşünürsek, "Bu seçenek neden Koleksiyonun özelliğini genişletmiyor?"

+2

Belgeler, "Bir koleksiyonun bilinen bir boyutu varsa, aynı zamanda Toplama alt türünü de içermelidir. Yalnızca potansiyel olarak sınırsız olan koleksiyonlar doğrudan Iterable alt sınıfına yazılmalıdır" diyor. –

+0

@Matt - bunu bir yanıt olarak gönderirseniz, kabul edilir! –

+0

@oxbow: Olması gerekenden emin değilim! Soru o zaman sadece biraz farklı: Neden Option, "Sonlu sayıda eleman ile koleksiyonları tanımlamak için kullanılan bir İyimser Varyant" olan Koleksiyon'u alt-türlememeli? –

İlgili konular