Spec-Zone.ru › Scala 2.12 Library

Трейт scala.collection.generic.IsTraversableLike

Компаньон объект IsTraversableLike

трейт IsTraversableLike[Repr] extends AnyRef

Трейт, который можно использовать для избежания дублирования кода при определении расширяющих методов, которые должны быть применимы как к существующим коллекциям Scala (т.е., типы, расширяющие GenTraversableLike) , так и к другим (возможно, определённым пользователем) типам, которые можно преобразовать в тип коллекции Scala. Этот трейт позволяет одинаково обрабатывать коллекции Scala и типы, которые могут быть неявным образом преобразованы в тип коллекции. Например, можно предоставить расширяющие методы, которые работают как с типами коллекций, так и с String (String не расширяют GenTraversableLike, но могут быть преобразованы в GenTraversableLike)

IsTraversable предоставляет два члена:

  1. тип-член A, который представляет тип элемента целевой GenTraversableLike[A, Repr]
  2. значение-член conversion, который предоставляет способ преобразования между типом, к которому мы хотим добавить расширяющие методы, Repr, и GenTraversableLike[A, Repr].
Использование

Необходимо предоставить IsTraversableLike в качестве неявного параметра типа неявного преобразования. Его использование показано ниже. Наша цель в следующем примере - предоставить общий расширяющий метод mapReduce для любого типа, который расширяет или может быть преобразован в GenTraversableLike. В нашем примере это включает String.

  import scala.collection.GenTraversableLike
  import scala.collection.generic.IsTraversableLike

  class ExtensionMethods[A, Repr](coll: GenTraversableLike[A, Repr]) {
    def mapReduce[B](mapper: A => B)(reducer: (B, B) => B): B = {
      val iter = coll.toIterator
      var res = mapper(iter.next())
      while (iter.hasNext)
        res = reducer(res, mapper(iter.next()))
      res
    }
  }

  implicit def withExtensions[Repr](coll: Repr)(implicit traversable: IsTraversableLike[Repr]) =
    new ExtensionMethods(traversable.conversion(coll))

// 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 типа GenTraversableLike[A, Repr], где A представляет тип элемента, а Repr представляет (как правило) тип коллекции. Реализация самого mapReduce проста.

Интересная часть - неявное преобразование withExtensions, которое возвращает экземпляр ExtensionMethods. Это неявное преобразование может быть применено только в том случае, если в области видимости существует неявное значение traversable типа IsTraversableLike[Repr]. Поскольку IsTraversableLike предоставляет значение-член conversion, который дает нам способ преобразования между любым типом, к которому мы хотим добавить расширяющий метод (в данном случае, Repr) и GenTraversableLike[A, Repr], мы теперь можем преобразовать coll из типа Repr в GenTraversableLike[A, Repr]. Это позволяет нам создать экземпляр класса ExtensionMethods, которому мы передаём наш новый метод GenTraversableLike[A, Repr].

Когда метод mapReduce вызывается на каком-то типе, который не является его членом, запускается поиск неявных значений. Поскольку неявное преобразование withExtensions является общим, оно будет применяться, пока не будет найдено неявное значение типа IsTraversableLike[Repr]. Учитывая, что IsTraversableLike содержит неявные члены, которые возвращают значения типа IsTraversableLike, это требование, как правило, выполняется, и запускается цепочка взаимодействий, описанная в предыдущем абзаце. (См. компаньон-объект IsTraversableLike, который содержит точное описание доступных неявных значений.)

Примечание: В настоящее время невозможно объединить неявное преобразование и класс с расширяющими методами в неявный класс из-за ограничений вывода типов.

Реализация IsTraversableLike для новых типов

Нужно просто предоставить неявное значение типа IsTraversableLike, специфичное для нового типа, или неявное преобразование, которое возвращает экземпляр IsTraversableLike , специфичное для нового типа.

Ниже приведён пример реализации трейта IsTraversableLike, где тип Repr — String.

implicit val stringRepr: IsTraversableLike[String] { type A = Char } =
  new IsTraversableLike[String] {
    type A = Char
    val conversion = implicitly[String => GenTraversableLike[Char, String]]
  }
Источник
IsTraversableLike.scala
С

2.10

Линейные надтипы

Типы-члены

абстрактный тип A

Абстрактные члены-значения

абстрактный val conversion: (Repr) ⇒ GenTraversableLike[A, Repr]

Члены-значения конкретного типа

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

Неявный
Этот член добавлен неявным преобразованием из IsTraversableLike[Repr] в any2stringadd[IsTraversableLike[Repr]], выполненным методом any2stringadd в scala.Predef.
Определяющие классы
any2stringadd

def ->[B](y: B): (IsTraversableLike[Repr], B)

Неявный
Этот член добавлен неявным преобразованием из IsTraversableLike[Repr] в ArrowAssoc[IsTraversableLike[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 зависит от платформы.

возвращает

копию объекта-получателя.

Атрибуты
protected[lang]
Определяющие классы
AnyRef
Аннотации
@throws( ... ) @native()
Примечание

не указано SLS как член AnyRef

def ensuring(cond: (IsTraversableLike[Repr]) ⇒ Boolean, msg: ⇒ Any): IsTraversableLike[Repr]

Неявный
Этот член добавлен неявным преобразованием из IsTraversableLike[Repr] в Ensuring[IsTraversableLike[Repr]], выполненным методом Ensuring в scala.Predef.
Определяющие классы
Ensuring

def ensuring(cond: (IsTraversableLike[Repr]) ⇒ Boolean): IsTraversableLike[Repr]

Неявный
Этот член добавлен неявным преобразованием из IsTraversableLike[Repr] в Ensuring[IsTraversableLike[Repr]] выполненным методом Ensuring в scala.Predef.
Классы-определения
Ensuring

def ensuring(cond: Boolean, msg: ⇒ Any): IsTraversableLike[Repr]

Неявный
Этот член добавлен неявным преобразованием из IsTraversableLike[Repr] в Ensuring[IsTraversableLike[Repr]] выполненным методом Ensuring в scala.Predef.
Классы-определения
Ensuring

def ensuring(cond: Boolean): IsTraversableLike[Repr]

Неявный
Этот член добавлен неявным преобразованием из IsTraversableLike[Repr] в Ensuring[IsTraversableLike[Repr]] выполненным методом Ensuring в scala.Predef.
Классы-определения
Ensuring

final def eq(arg0: AnyRef): Boolean

Проверяет, является ли аргумент (that) ссылкой на объект-приёмник (this).

Метод eq реализует отношение эквивалентности на не-нулевых экземплярах AnyRef, и обладает тремя дополнительными свойствами:

    Он согласован: для любых не-нулевых экземпляров x и y типа AnyRef, многократные вызовы x.eq(y) последовательно возвращают true или последовательно возвращают false.Для любого не-нулевого экземпляра 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: Any): Boolean

Метод равенства для ссылочных типов. По умолчанию делегирует вызов методу eq.

См. также equals в scala.Any.

возвращает

true если объект-приёмник эквивалентен аргументу; false в противном случае.

Классы-определения
AnyRef → Any

def finalize(): Unit

Вызывается сборщиком мусора для объекта-приёмника, когда на объект больше нет ссылок.

Детали вызова метода finalize, а также взаимодействие finalize с нелокальными возвратами и исключениями, зависят от платформы.

Атрибуты
protected[lang]
Классы-определения
AnyRef
Аннотации
@throws( classOf[java.lang.Throwable] )
Примечание

не указан SLS как член AnyRef

def formatted(fmtstr: String): String

Возвращает строку, отформатированную в соответствии с данной строкой format. Формат строк аналогичен String.format (@см java.lang.String.format).

Неявный
Этот член добавлен неявным преобразованием из IsTraversableLike[Repr] в StringFormat[IsTraversableLike[Repr]] выполненным методом StringFormat в scala.Predef.
Классы-определения
StringFormat
Аннотации
@inline()

final def getClass(): Class[_]

Возвращает представление класса объекта во время выполнения.

возвращает

объект класса, соответствующий типу времени выполнения приёмника.

Классы-определения
AnyRef → Any
Аннотации
@native()

def hashCode(): Int

Метод hashCode для ссылочных типов. См. hashCode в scala.Any.

возвращает

значение хеша для этого объекта.

Классы-определения
AnyRef → Any
Аннотации
@native()

final def isInstanceOf[T0]: Boolean

Проверка, является ли динамический тип объекта-приёмника типом T0.

Обратите внимание, что результат проверки зависит от правил стирания типов Scala. Поэтому выражение 1.isInstanceOf[String] вернёт false, а выражение List(1).isInstanceOf[List[String]] вернёт true. В последнем примере, поскольку аргумент типа стирается во время компиляции, невозможно проверить, соответствуют ли элементы списка заданному типу.

returns

true если объект-приёмник является экземпляром стираемого типа T0; false в противном случае.

Definition Classes
Any

final def ne(arg0: AnyRef): Boolean

Эквивалентно !(this eq that).

returns

true если аргумент не является ссылкой на объект-приёмник; false в противном случае.

Definition Classes
AnyRef

final def notify(): Unit

Разбудит единственную нить, ожидающую монитор объекта-приёмника.

Definition Classes
AnyRef
Annotations
@native()
Note

не указано в SLS как член AnyRef

final def notifyAll(): Unit

Разбудит все нити, ожидающие монитор объекта-приёмника.

Definition Classes
AnyRef
Annotations
@native()
Note

не указано в SLS как член AnyRef

final def synchronized[T0](arg0: ⇒ T0): T0

Definition Classes
AnyRef

def toString(): String

Создаёт строковое представление этого объекта. По умолчанию представление зависит от платформы. На платформе Java это конкатенация имени класса, «@» и хэш-кода объекта в шестнадцатеричном формате.

returns

строковое представление объекта.

Definition Classes
AnyRef → Any

final def wait(): Unit

Definition Classes
AnyRef
Annotations
@throws( ... )

final def wait(arg0: Long, arg1: Int): Unit

Definition Classes
AnyRef
Annotations
@throws( ... )

final def wait(arg0: Long): Unit

Definition Classes
AnyRef
Annotations
@throws( ... ) @native()

def →[B](y: B): (IsTraversableLike[Repr], B)

Неявный
Этот член добавлен неявным преобразованием из IsTraversableLike[Repr] в ArrowAssoc[IsTraversableLike[Repr]] при помощи метода ArrowAssoc в scala.Predef.
Definition Classes
ArrowAssoc

© 2002-2019 EPFL, with contributions from Lightbend.
Licensed under the Apache License, Version 2.0.
https://www.scala-lang.org/api/2.12.9/scala/collection/generic/IsTraversableLike.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API