Почему Option не расширяет черту Iterable напрямую? - PullRequest
17 голосов
/ 09 апреля 2010

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)

1 Ответ

9 голосов
/ 10 апреля 2010

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

Some(1) ++ Some(2)

Это в настоящее время компилируется и оценивается в List (1,2) с помощью имплицитов в 2.8, но кажется странным.

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

Only potentially unbounded collections should directly sub-class Iterable

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

...