Трейт scala.collection.generic.IsIterable
Компаньон объект IsIterable
трейт IsIterable[Repr] extends IsIterableOnce[Repr]
Тип-члены
абстрактный тип A
Тип элементов, по которым мы можем итерироваться (например, Int).
- Определяющие классы
- IsIterableOnce
абстрактный тип C
Тип, возвращаемый операциями преобразования, сохраняющими тот же тип элементов (например, filter, take).
На практике этот тип часто является Repr , за исключением случая SeqView[A] (и других View[A] подклассов), где он является «только» View[A].
Абстрактные члены-значения
абстрактный def apply(coll: Repr): IterableOps[A, Iterable, C]
Преобразование из типа Repr в IterableOps[A, Iterable, C]
- Определяющие классы
- IsIterable → IsIterableOnce
Члены-значения
final def !=(arg0: Any): Boolean
Проверка двух объектов на неравенство.
- возвращает
trueесли !(this == that), иначе false.
- Определяющие классы
- AnyRef → Any
final def ##(): Int
Эквивалентно x.hashCode за исключением упакованных числовых типов и null. Для числовых типов возвращает хэш-значение, согласованное с равенством значений: если два экземпляра типа значения сравниваются как true, то ## вернёт одно и то же хэш-значение для каждого из них. Для null возвращает хэш-код, где null.hashCode вызывает NullPointerException.
- возвращает
хэш-значение, согласованное с ==
- Определяющие классы
- AnyRef → Any
def +(other: String): String
- Неявное
- Этот член добавлен неявным преобразованием из IsIterable[Repr] вany2stringadd[IsIterable[Repr]], выполненным методом any2stringadd в scala.Predef.
- Определяющие классы
- any2stringadd
def ->[B](y: B): (IsIterable[Repr], B)
- Неявное
- Этот член добавлен неявным преобразованием из IsIterable[Repr] вArrowAssoc[IsIterable[Repr]], выполненным методом ArrowAssoc в scala.Predef.
- Определяющие классы
- ArrowAssoc
- Аннотации
- @inline()
final def ==(arg0: Any): Boolean
Выражение x == that эквивалентно if (x eq null) that eq null else x.equals(that).
- возвращает
trueесли объект-получатель эквивалентен аргументу;falseв противном случае.
- Определяющие классы
- AnyRef → Any
final def asInstanceOf[T0]: T0
Привести объект-получатель к типу T0.
Обратите внимание, что успех приведения в ходе выполнения зависит от семантики стирания Scala. Поэтому выражение 1.asInstanceOf[String] выбросит ClassCastException во время выполнения, в то время как выражение List(1).asInstanceOf[List[String]] нет. В последнем примере, так как тип аргумента стирается во время компиляции, невозможно проверить, являются ли элементы списка нужного типа.
- возвращает
объект-получатель.
- Определяющие классы
- Any
- Исключения
ClassCastException, если объект-получатель не является экземпляром стирания типаT0.
def clone(): AnyRef
Создаёт копию объекта-получателя.
По умолчанию реализация метода clone зависит от платформы.
- возвращает
копию объекта-получателя.
def ensuring(cond: (IsIterable[Repr]) => Boolean, msg: => Any): IsIterable[Repr]
- Неявное
- Этот член добавлен неявным преобразованием из IsIterable[Repr] вEnsuring[IsIterable[Repr]], выполненным методом Ensuring в scala.Predef.
- Определяющие классы
- Ensuring
def ensuring(cond: (IsIterable[Repr]) => Boolean): IsIterable[Repr]
- Неявный
- Этот член добавлен неявным преобразованием из IsIterable[Repr] в Ensuring[IsIterable[Repr]], выполненным методом Ensuring в scala.Predef.
- Определяющие классы
- Ensuring
def ensuring(cond: Boolean, msg: => Any): IsIterable[Repr]
- Неявный
- Этот член добавлен неявным преобразованием из IsIterable[Repr] в Ensuring[IsIterable[Repr]], выполненным методом Ensuring в scala.Predef.
- Определяющие классы
- Ensuring
def ensuring(cond: Boolean): IsIterable[Repr]
- Неявный
- Этот член добавлен неявным преобразованием из IsIterable[Repr] в Ensuring[IsIterable[Repr]], выполненным методом Ensuring в scala.Predef.
- Определяющие классы
- Ensuring
final def eq(arg0: AnyRef): Boolean
Проверяет, является ли аргумент (that) ссылкой на объект-получатель (this).
Метод eq реализует отношение эквивалентности на не-null экземплярах AnyRef, и имеет три дополнительных свойства:
-
Он согласован: для любых не-null экземпляров
x и y типа AnyRef, многократные вызовы x.eq(y) последовательно возвращают true или последовательно возвращают false. Для любого не-null экземпляра x типа AnyRef, x.eq(null) и null.eq(x) возвращает false.
null.eq(null) возвращает true. При переопределении методов equals или hashCode важно обеспечить согласованность их поведения с равенством ссылок. Поэтому, если два объекта являются ссылками друг на друга (o1 eq o2), они должны быть равны друг другу (o1 == o2) и должны иметь одинаковое значение хеш-кода (o1.hashCode == o2.hashCode).
- возвращает
trueесли аргумент является ссылкой на объект-получатель;falseв противном случае.
- Определяющие классы
- AnyRef
def equals(arg0: AnyRef): Boolean
Метод равенства для ссылочных типов. Реализация по умолчанию делегирует вызов eq.
См. также equals в scala.Any.
- возвращает
trueесли объект-получатель эквивалентен аргументу;falseв противном случае.
- Определяющие классы
- AnyRef → Any
def finalize(): Unit
Вызывается сборщиком мусора для объекта-получателя, когда к нему больше нет ссылок.
Подробности о том, когда и как вызывается метод finalize, а также взаимодействие finalize с нелокальными возвратами и исключениями, зависят от платформы.
def formatted(fmtstr: String): String
Возвращает строку, отформатированную согласно данной строке format. Форматные строки аналогичны строкам для String.format (@см. java.lang.String.format).
- Неявный
- Этот член добавлен неявным преобразованием из IsIterable[Repr] в StringFormat[IsIterable[Repr]] выполненным методом StringFormat в scala.Predef.
- Определяющие классы
- StringFormat
- Аннотации
- @inline()
final def getClass(): Class[_ <: AnyRef]
Возвращает представление класса объекта во время выполнения.
- возвращает
объект класса, соответствующий типу объекта во время выполнения.
def hashCode(): Int
Метод hashCode для ссылочных типов. См. hashCode в scala.Any.
- возвращает
значение хэш-кода для этого объекта.
final def isInstanceOf[T0]: Boolean
Проверка, является ли динамический тип объекта-получателя T0.
Обратите внимание, что результат проверки зависит от семантики стирания Scala. Поэтому выражение 1.isInstanceOf[String] вернёт false, а выражение List(1).isInstanceOf[List[String]] вернёт true. В последнем примере, так как аргумент типа стирается во время компиляции, невозможно проверить, соответствуют ли элементы списка указанному типу.
- возвращает
trueесли объект-получатель является экземпляром стираемого типаT0;falseв противном случае.
- Классы определения
- Any
final def ne(arg0: AnyRef): Boolean
Эквивалентно !(this eq that).
- возвращает
trueесли аргумент не является ссылкой на объект-получатель;falseв противном случае.
- Классы определения
- AnyRef
final def notify(): Unit
Разбуживает одиночную нить, ожидающую монитор объекта-получателя.
- Классы определения
- AnyRef
- Аннотации
- @native()
- Примечание
не определено SLS как член AnyRef
final def notifyAll(): Unit
Разбуживает все нити, ожидающие монитор объекта-получателя.
- Классы определения
- AnyRef
- Аннотации
- @native()
- Примечание
не определено SLS как член AnyRef
final def synchronized[T0](arg0: => T0): T0
- Классы определения
- AnyRef
def toString(): String
Создаёт строковое представление этого объекта. По умолчанию представление зависит от платформы. На платформе Java это конкатенация имени класса, "@" и хэш-кода объекта в шестнадцатеричном формате.
- возвращает
строковое представление объекта.
- Классы определения
- AnyRef → Any
final def wait(): Unit
- Классы определения
- AnyRef
- Аннотации
- @throws(classOf[java.lang.InterruptedException])
final def wait(arg0: Long, arg1: Int): Unit
- Классы определения
- AnyRef
- Аннотации
- @throws(classOf[java.lang.InterruptedException])
final def wait(arg0: Long): Unit
© 2002-2019 EPFL, with contributions from Lightbend.
Licensed under the Apache License, Version 2.0.
https://www.scala-lang.org/api/2.13.0/scala/collection/generic/IsIterable.html
Трейт, который можно использовать для избежания дублирования кода при определении расширяющих методов, которые должны применяться как к существующим коллекциям Scala (т.е., типы, расширяющие
Iterable), так и к другим (возможно, определяемым пользователем) типам, которые можно преобразовать в тип коллекции Scala. Этот трейт позволяет одинаково обрабатывать коллекции Scala и типы, которые могут быть неявным образом преобразованы в тип коллекции. Например, можно предоставить расширяющие методы, которые работают как с типами коллекций, так и сString(Stringне расширяютIterable, но могут быть преобразованы вIterable).IsIterableпредоставляет три члена:A, который представляет тип элементов целевойIterable[A]C, который представляет тип, возвращаемый операциями преобразования, сохраняющими тип элементов коллекцииapply, который предоставляет способ преобразования между типом, к которому мы хотим добавить расширяющие методы,Repr, иIterableOps[A, Iterable, C].Использование
Необходимо предоставить
IsIterableв качестве неявного параметра типа неявного преобразования. Его использование показано ниже. Наша цель в следующем примере — предоставить универсальный расширяющий методmapReduceлюбому типу, который расширяет или может быть преобразован вIterable. В нашем примере это включаетString.import scala.collection.{Iterable, IterableOps} import scala.collection.generic.IsIterable class ExtensionMethods[Repr, I <: IsIterable[Repr]](coll: Repr, it: I) { def mapReduce[B](mapper: it.A => B)(reducer: (B, B) => B): B = { val iter = it(coll).iterator var res = mapper(iter.next()) while (iter.hasNext) res = reducer(res, mapper(iter.next())) res } } implicit def withExtensions[Repr](coll: Repr)(implicit it: IsIterable[Repr]): ExtensionMethods[Repr, it.type] = new ExtensionMethods(coll, it) // See it in action! List(1, 2, 3).mapReduce(_ * 2)(_ + _) // res0: Int = 12 "Yeah, well, you know, that's just, like, your opinion, man.".mapReduce(x => 1)(_ + _) // res1: Int = 59Здесь мы начинаем с создания класса
ExtensionMethods, содержащего наш расширяющий методmapReduce.Обратите внимание, что
ExtensionMethodsпринимает аргумент конструктораcollтипаRepr, гдеReprпредставляет (как правило) тип коллекции, и аргументitтипа, являющегося подтипомIsIterable[Repr]. Тело метода начинается с преобразования аргументаcollвIterableOpsдля вызова методаiteratorна нем. Остальная часть реализации тривиальна.Неявное преобразование
withExtensionsделает операциюmapReduceдоступной для любого типаRepr, для которого существует неявныйIsIterable[Repr]экземпляр. Обратите внимание, как мы отслеживаем точный тип неявного аргументаitс использованием типа-синглетонаit.type, а не более широкого типаIsIterable[Repr]. Мы делаем это, чтобы информация, содержащаяся в членах типаAиCаргументаit, не терялась.Когда метод
mapReduceвызывается на каком-либо типе, не являющимся его членом, запускается поиск неявных значений. Поскольку неявное преобразованиеwithExtensionsявляется универсальным, оно будет применяться, до тех пор, пока не будет найдено неявное значение типаIsIterable[Repr]. Учитывая, что компаньон-объектIsIterableсодержит неявные члены, возвращающие значения типаIsIterable, это требование обычно выполняется, и запускается цепочка взаимодействий, описанная в предыдущем абзаце. (См. компаньон-объектIsIterable, который содержит точное описание доступных неявных значений).Примечание: В настоящее время невозможно объединить неявное преобразование и класс с расширяющими методами в неявный класс из-за ограничений вывода типов.
Реализация
IsIterableдля новых типовНеобходимо просто предоставить неявное значение типа
IsIterable, специфичное для нового типа, или неявное преобразование, которое возвращает экземплярIsIterable, специфичный для нового типа.Ниже приведен пример реализации трейта
IsIterable, где типReprявляетсяRange.implicit val rangeRepr: IsIterable[Range] { type A = Int; type C = IndexedSeq[Int] } = new IsIterable[Range] { type A = Int type C = IndexedSeq[Int] def apply(coll: Range): IterableOps[Int, IndexedSeq, IndexedSeq[Int]] = coll }(Обратите внимание, что на практике экземпляр
IsIterable[Range]уже предоставляется стандартной библиотекой и определен как экземплярIsSeq[Range]).