Цель toIterable - PullRequest
       31

Цель toIterable

3 голосов
/ 29 сентября 2019

В scala exercies Я нашел следующий пример:

val set = Set(4, 6, 7, 8, 9, 13, 14)
val result = set.toIterable

со следующим описанием:

toIterable преобразует любой Traversable to Iterable. Это базовая черта для всех коллекций Scala, которые определяют метод итератора для перебора элементов коллекции

Но Set уже является Iterable, так в чем смыслэтого метода?Если это не правильный случай, не могли бы вы указать мне один?

Ответы [ 2 ]

5 голосов
/ 29 сентября 2019

В Scala 2.13 есть не более Traversable:

Упрощенная иерархия типов

Не более Traversable иTraversableOnce.Они остаются только устаревшими псевдонимами для Iterable и IterableOnce.

Вызов toIterable на Set является избыточным, поскольку он просто возвращает эту же коллекцию:

Эта коллекция как Iterable[A]. Новая коллекция не будет построена, если это уже Iterable[A].

Примеры, где toIterable будет иметь эффект, будут

"Hello".toIterable
Array(1).toIterable

который неявно преобразуется в

wrapString("Hello").toIterable
wrapIntArray(Array(1)).toIterable

и превращает эти Java-подобные типы в собственные коллекции Scala.

1 голос
/ 29 сентября 2019

В дополнение к ответу Марио Галича, он также меняет статический тип.Если вы и компилятор знали, что это было Set до вызова, вы не знаете потом.Хотя то же самое может быть достигнуто с помощью надписи типа

val result: Iterable[Int] = set

(и это также будет работать для строк и массивов), тогда вам нужно записать параметр типа, который может быть гораздо более сложным, чем Int.

Зачем мне его использовать?Если я знаю, что это Set, зачем мне менять тип на Iterable?

  1. это может быть метод, который может быть переопределен и не должен возвращать Set в подклассах:

    class Super {
      def someValues = {
        val set = ... // you want to avoid duplicates
        set
      }
    }
    
    class Sub : Super {
      override def someValues = {
        List(...) // happens to have duplicates this time
      }
    

    нескомпилировать, но если бы Super#someValues вернул set.toIterable (хотя обычно рекомендуется иметь явные типы возвращаемых данных).

  2. Это может повлиять на более поздние предполагаемые типы:

    val arr = Array(set)
    arr(0) = List(0, 1, 2, 3)
    

    не компилируется, но будет с Array(set.toIterable).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...