سؤال

Option قابلة للتحويل ضمنيًا إلى Iterable - ولكن لماذا لا ينفذ فقط Iterable مباشرة:

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
}

تعديل: في الواقع ، إنه حتى من ذلك لأنه في 2.8 Option هل يعلن iterator طريقة:

def iterator: Iterator[A] = 
  if (isEmpty) Iterator.empty else Iterator.single(this.get)
هل كانت مفيدة؟

المحلول

أعتقد أنه كان هناك الكثير من الأساليب غير المنطقية التي ستكون مطلوبة. على سبيل المثال ، ماذا تتوقع أن تكون قيمة الإرجاع من أجل:

Some(1) ++ Some(2)

يعمل هذا حاليًا على تجميع وتقييم القائمة (1،2) عبر الضمني في 2.8 ، ولكن يبدو غريباً.

ربما لهذا السبب يعلق المستند في 2.7:

Only potentially unbounded collections should directly sub-class Iterable

تعديل: كما هو موضح في تعليق @Mattr أدناه ، فإن ترك توصية Doc-Comment إلى مجموعة من النوع الفرعي قد يكون مضللاً. وبالنظر إلى أن هذا السؤال يحول هذا السؤال إلى "لماذا لا يمد الخيار سمة التجميع؟"

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top