Подтвердить что ты не робот

Почему опция не расширяет свойство Iterable напрямую?

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)
4b9b3361

Ответ 1

Я думаю, что было слишком много ненужных методов, которые потребовались бы. Например, что вы ожидаете от возвращаемого значения:

Some(1) ++ Some(2)

В настоящее время он компилирует и оценивает список (1,2) через implicits в 2.8, но кажется странным.

Возможно, поэтому комментарии в документе 2.7 говорят:

Only potentially unbounded collections should directly sub-class Iterable

Изменить: Как показано в комментарии @MattR ниже, я оставляю рекомендацию doc-comment для подтипа Collection потенциально обманчивым. И учитывая, что этот вопрос превращает этот вопрос в "Почему опция не расширяет черту коллекции?"