Spec-Zone.ru › Scala 2.12 Library

Object scala.language

object language

The scala.language object controls the language features available to the programmer, as proposed in the SIP-18 document.

Each of these features has to be explicitly imported into the current scope to become available:

import language.postfixOps // or language._
List(1, 2, 3) reverse

The language features are:

  • dynamics enables defining calls rewriting using the Dynamic trait
  • postfixOps enables postfix operators
  • reflectiveCalls enables using structural types
  • implicitConversions enables defining implicit methods and members
  • higherKinds enables writing higher-kinded types
  • existentials enables writing existential types
  • experimental contains newer features that have not yet been tested in production
Source
language.scala
Linear Supertypes

Члены-значения

final def !=(arg0: Any): Boolean

Проверка двух объектов на неравенство.

возвращает

true если !(this == that), в противном случае false.

Определяющие классы
AnyRef → Any

final def ##(): Int

Эквивалентно x.hashCode, за исключением упакованных числовых типов и null. Для чисел возвращается значение хеша, согласованное с равенством значений: если два экземпляра типов значений сравниваются как true, то ## вернёт одинаковое значение хеша для каждого из них. Для null возвращается хешкод, где null.hashCode выбрасывает NullPointerException.

возвращает

значение хеша, согласованное с ==

Определяющие классы
AnyRef → Any

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

implicit lazy val dynamics: dynamics

Если включено, можно определять прямые или косвенные подклассы трейта scala.Dynamic. Если динамика не включена, определение класса, трейта или объекта с Dynamic в качестве базового трейта отклоняется. Выбор динамических членов существующих подклассов трейта Dynamic не затрагивается; они могут использоваться где угодно.

Почему введено это свойство? Для гибких DSL и удобного взаимодействия с динамическими языками.

Почему это контролируется? Динамический выбор членов может подорвать статическую проверяемость программ. Кроме того, динамический выбор членов часто полагается на рефлексию, которая не доступна на всех платформах.

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

implicit lazy val existentials: existentials

Только при включении, существенные типы, которые нельзя выразить как типы-подстановочные знаки, могут быть записаны и разрешены в выведенных типах значений или типах возвращаемых значений методов. Существенные типы с синтаксисом типа-подстановочного знака, например List[_], или Map[String, _] не затрагиваются.

Почему сохранено это свойство? Существенные типы необходимы для понимания подстановочных знаков и необработанных типов Java, а также стёртых типов значений во время выполнения.

Почему это контролируется? Наличие сложных существенных типов в кодовой базе, как правило, делает код приложения очень хрупким, с тенденцией к ошибкам типа с неясными сообщениями об ошибках. Поэтому чрезмерное увлечение существенными типами обычно не считается хорошей идеей. Кроме того, сложные существенные типы могут больше не поддерживаться в будущем упрощении языка.

def finalize(): Unit

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

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

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

не указан SLS в качестве члена AnyRef

final def getClass(): Class[_]

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

возвращает

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

Определяющие классы
AnyRef → Any
Аннотации
@native()

def hashCode(): Int

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

возвращает

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

Определяющие классы
AnyRef → Any
Аннотации
@native()

implicit lazy val higherKinds: higherKinds

Только при включении этого флага можно писать типы высшего порядка.

Почему сохранять функцию? Типы высшего порядка позволяют определять очень общие абстракции, такие как функтор, монада или стрелка. Значительное количество расширенных библиотек опирается на них. Типы высшего порядка также лежат в основе усилий scala-virtualized по созданию высокопроизводительных параллельных DSL с помощью стадирования.

Почему контролировать ее? Типы высшего порядка в Scala приводят к тюрн-полному типу системы, где гарантии завершения компиляции больше нет. Они, как правило, полезны в основном для вычислений на уровне типов и для высокообобщенных шаблонов проектирования. Уровень абстракции, подразумеваемый этими шаблонами проектирования, часто является препятствием для понимания новичками кодовой базы Scala. Некоторые синтаксические аспекты типов высшего порядка трудно понять для неосведомленных, а вывод типов для них менее эффективен, чем для обычных типов. Поскольку мы до конца не удовлетворены ими, вполне возможно, что некоторые аспекты типов высшего порядка изменятся в будущих версиях Scala. Таким образом, явное включение также служит предупреждением о том, что код, включающий типы высшего порядка, может потребовать незначительной переработки в будущем.

implicit lazy val implicitConversions: implicitConversions

Только при включении разрешаются определения неявных преобразований. Неявное преобразование — это неявное значение типа унарной функции A => B, или неявный метод, который в своей первой секции параметров содержит единственный, неявный параметр. Примеры:

implicit def stringToInt(s: String): Int = s.length
implicit val conv = (s: String) => s.length
implicit def listToX(xs: List[T])(implicit f: T => X): X = ...

Неявные значения других типов не затрагиваются, также как и неявные классы.

Почему сохранять функцию? Неявные преобразования являются центральными для многих аспектов основных библиотек Scala.

Почему контролировать ее? Известно, что неявные преобразования могут вызывать множество ловушек, если ими злоупотреблять. И есть тенденция злоупотреблять ими, потому что они кажутся очень мощными, и их эффекты кажутся легкими для понимания. Кроме того, в большинстве ситуаций использование неявных параметров приводит к лучшему дизайну, чем неявные преобразования.

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

implicit lazy val postfixOps: postfixOps

Только при включении будет разрешен постфиксный операторный синтаксис (expr op).

Почему сохранять функцию? Несколько DSL, написанных на Scala, нуждаются в этом синтаксисе.

Почему контролировать ее? Постфиксные операторы плохо взаимодействуют с выводом точек с запятой. Большинство программистов избегают их по этой причине.

implicit lazy val reflectiveCalls: reflectiveCalls

Только при включении поддерживаются обращения к членам структурных типов, которые требуют рефлексии. Напоминание: Структурный тип имеет вид Parents { Decls } , где Decls содержит объявления новых членов, которые не переопределяют ни один член в Parents. Для доступа к одному из этих членов требуется рефлексивный вызов.

Почему сохранять функцию? Структурные типы обеспечивают большую гибкость, потому что они избегают необходимости предварительного определения иерархий наследования. Кроме того, их определение вполне естественно вытекает из концепции уточнения типов в Scala.

Почему контролировать ее? Рефлексия недоступна на всех платформах. Такие популярные инструменты, как ProGuard, имеют проблемы с ней. Даже там, где рефлексия доступна, рефлексивный диспетчер может привести к неожиданному снижению производительности.

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

Определяющие классы
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()

object experimental

Экспериментальный объект содержит функции, которые недавно были добавлены, но ещё не были полностью протестированы в рабочей среде.

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

Программистам рекомендуется опробовать экспериментальные функции и сообщить о любых ошибках или несоответствиях API, с которыми они сталкиваются, чтобы они могли быть улучшены в будущих выпусках.

© 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/language$.html

Spec-Zone.ru

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