Пакет scala
пакет scala
Члены пакета
пакет annotation
пакет beans
пакет collection
пакет compat
пакет concurrent
Этот пакет содержит примитивы для конкуретного и параллельного программирования.
Руководство
Более подробное руководство по Future и Promise, включая обсуждение и примеры, можно найти по адресу http://docs.scala-lang.org/overviews/core/futures.html.
Общие импорты
При работе с Future часто удобно импортировать весь пакет concurrent:
import scala.concurrent._
При использовании таких вещей, как Futures, часто требуется неявный ExecutionContext в области видимости. Общие рекомендации по этим неявным параметрам следующие.
Если рассматриваемый код представляет собой определение класса или метода, и нет доступного ExecutionContext , запросите его у вызывающего элемента, добавив список неявных параметров:
def myMethod(myParam: MyType)(implicit ec: ExecutionContext) = …
//Or
class MyClass(myParam: MyType)(implicit ec: ExecutionContext) { … }
Это позволяет вызывающему элементу метода или создателю экземпляра класса определить, какой ExecutionContext следует использовать.
Для типичного использования REPL и экспериментов часто желательно импортировать глобальный ExecutionContext.
import scala.concurrent.ExcutionContext.Implicits.global
Указание продолжительности
Операции часто требуют указания продолжительности. Доступен DSL для продолжительности, чтобы облегчить определение этих значений:
import scala.concurrent.duration._ val d: Duration = 10.seconds
Использование Future для неблокирующего вычисления
Базовое использование future легко с помощью фабричного метода в Future, который асинхронно выполняет предоставленную функцию, возвращая будущий результат этой функции без блокировки текущей нити. Для создания Future вам нужно предоставить ExecutionContext, либо неявно, либо явно:
import scala.concurrent._
import ExecutionContext.Implicits.global // implicit execution context
val firstZebra: Future[Int] = Future {
val source = scala.io.Source.fromFile("/etc/dictionaries-common/words")
source.toSeq.indexOfSlice("zebra")
}
Избегайте блокировки
Хотя блокировка возможна для ожидания результатов (с обязательной длительностью таймаута):
import scala.concurrent.duration._ Await.result(firstZebra, 10.seconds)
и хотя это иногда необходимо, особенно для целей тестирования, блокировка в целом не рекомендуется при работе с Future и параллелизмом, чтобы избежать потенциальных тупиков и повысить производительность. Вместо этого используйте обратные вызовы или комбинаторы, чтобы оставаться в области Future:
val animalRange: Future[Int] = for {
aardvark <- firstAardvark
zebra <- firstZebra
} yield zebra - aardvark
animalRange.onSuccess {
case x if x > 500000 => println("It's a long way from Aardvark to Zebra")
}
пакет io
пакет jdk
пакет math
Пакет object scala.math содержит методы для выполнения основных числовых операций, таких как элементарные экспоненциальные, логарифмические, корневые и тригонометрические функции.
Все методы передают в java.lang.Math, если не указано иное.
- См. также
java.lang.Math
пакет ref
пакет reflect
пакет sys
Пакет object scala.sys содержит методы для чтения и изменения основных аспектов виртуальной машины, а также внешнего мира.
- С
2.9
пакет util
Члены типов
тип ::[A] = scala.collection.immutable.::[A]
запечатанный абстрактный класс <:<[-From, +To] extends (From) => To с Serializable
Пример A <:< B свидетельствует о том, что A является подтипом B. Требование неявного аргумента типа A <:< B кодирует обобщённое ограничение A <: B.
Чтобы ограничить любой абстрактный тип T, который находится в области видимости в списке аргументов метода (не только собственные параметры типа метода), просто добавьте неявный аргумент типа T <:< U, где U является требуемым верхним ограничением; или для нижних ограничений используйте: L <:< T, где L является требуемым нижним ограничением.
В случае возникновения каких-либо неясностей относительно того, какой метод идёт в каком направлении, все методы "Co" (включая apply) идут слева направо в типе ("с" типом), а все методы "Contra" идут справа налево ("против" типа). Например, apply преобразует From в To, а substituteContra заменяет To в типе на From.
Частично подготовлено Джейсоном Заугом.
- From
тип, который доказан как подтип
To- To
тип, который доказан как супертип
From
- Аннотации
- @implicitNotFound("Невозможно доказать, что ${From} <:< ${To}.")
- См. также
=:= для выражения ограничений равенства
sealed trait Option[+A] {
// def flatten[B, A <: Option[B]]: Option[B] = ...
// won't work, since the A in flatten shadows the class-scoped A.
def flatten[B](implicit ev: A <:< Option[B]): Option[B]
= if(isEmpty) None else ev(get)
// Because (A <:< Option[B]) <: (A => Option[B]), ev can be called to turn the
// A from get into an Option[B], and because ev is implicit, that call can be
// left out and inserted automatically.
}
запечатанный абстрактный класс =:=[From, To] extends <:<[From, To] с Serializable
Пример A =:= B свидетельствует о том, что типы A и B равны. Он также выступает как A <:< B, но не как B <:< A (непосредственно) из-за ограничений на наследование.
В случае возникновения каких-либо неясностей относительно того, какой метод идёт в каком направлении, все методы "Co" (включая apply) идут слева направо в типе ("с" типом), а все методы "Contra" идут справа налево ("против" типа). Например, apply преобразует From в To, а substituteContra заменяет To в типе на From.
- From
тип, который доказан как равный
To- To
тип, который доказан как равный
From
- Аннотации
- @implicitNotFound("Невозможно доказать, что ${From} =:= ${To}.")
- См. также
<:< для выражения ограничений подтипов
Вариант in-place для scala.collection.mutable.ArrayBuffer#transpose
implicit class BufOps[A](private val buf: ArrayBuffer[A]) extends AnyVal {
def inPlaceTranspose[E]()(implicit ev: A =:= ArrayBuffer[E]) = ???
// Because ArrayBuffer is invariant, we can't make do with just a A <:< ArrayBuffer[E]
// Getting buffers *out* from buf would work, but adding them back *in* wouldn't.
}
тип AbstractMethodError = java.lang.AbstractMethodError
абстрактный класс Any
Класс Any является корнем иерархии классов Scala. Каждый класс в среде выполнения Scala наследует непосредственно или косвенно от этого класса.
Начиная с Scala 2.10, возможно прямое расширение Any с помощью универсальных трейтов. Универсальный трейт — это трейт, который расширяет Any, содержит только def и не производит инициализацию.
Основной случай использования универсальных трейтов — это разрешить базовое наследование методов для классов значений. Например,
trait Printable extends Any {
def print(): Unit = println(this)
}
class Wrapper(val underlying: Int) extends AnyVal with Printable
val w = new Wrapper(3)
w.print()
См. Классы значений и универсальные трейты для получения дополнительной информации о взаимодействии универсальных трейтов и классов значений.
абстрактный класс AnyVal extends Any
AnyVal — это базовый класс всех типов значений, которые описывают значения, не реализованные как объекты в базовой системе хоста. Классы значений определены в спецификации языка Scala, раздел 12.2.
Стандартная реализация включает девять AnyVal подтипов:
scala.Double, scala.Float, scala.Long, scala.Int, scala.Char, scala.Short и scala.Byte — это числовые типы значений.
scala.Unit и scala.Boolean — это нечисловые типы значений.
Другие группы:
-
Типы поддиапазона — это scala.Byte, scala.Short и scala.Char. Типы целых чисел включают типы поддиапазона, а также scala.Int и scala.Long. Типы с плавающей запятой — scala.Float и scala.Double.
До Scala 2.10, AnyVal был запечатанным траитом. Однако начиная с Scala 2.10, можно определить подкласс AnyVal, называемый пользовательским классом значений, который обрабатывается компилятором особым образом. Правильно определённые пользовательские классы значений обеспечивают возможность повышения производительности для пользовательских типов, избегая выделения памяти для объекта во время выполнения и заменяя вызовы виртуальных методов вызовами статических методов.
Пользовательские классы значений, которые избегают выделения памяти…
-
должны иметь единственный
val параметр, который является базовым представлением во время выполнения.могут определять def, но не val, var или вложенные traits, class или object.обычно наследуют только от траита AnyVal.не могут использоваться в тестах типов или сопоставления с образцом.не могут переопределять методы equals или hashCode.Минимальный пример:
class Wrapper(val underlying: Int) extends AnyVal {
def foo: Wrapper = new Wrapper(underlying * 19)
}
Важно отметить, что пользовательские классы значений ограничены, и в некоторых случаях всё ещё должны выделять память для экземпляра класса значений во время выполнения. Эти ограничения и обстоятельства подробно описаны в Value Classes and Universal Traits.
траит App extends DelayedInit
Траит App может быть использован для быстрого преобразования объектов в исполняемые программы. Вот пример:
object Main extends App {
Console.println("Hello World: " + (args mkString ", "))
}
Явный метод main не требуется. Вместо этого весь тело класса становится «главным методом».
args возвращает текущие аргументы командной строки в виде массива.
Ограничения
Следует отметить, что этот траит реализован с использованием функциональности DelayedInit, что означает, что поля объекта не будут инициализированы до выполнения главного метода.
Будущие версии этого траита больше не будут наследовать от DelayedInit.
- Since
2.1
final класс Array[T] extends java.io.Serializable with java.lang.Cloneable
Массивы — это изменяемые, индексированные коллекции значений. Array[T] — представление Scala для T[] Java.
val numbers = Array(1, 2, 3, 4) val first = numbers(0) // read the first element numbers(3) = 100 // replace the 4th array element with 100 val biggerNumbers = numbers.map(_ * 2) // multiply all numbers by two
Массивы используют два распространённых элемента синтаксического сахара Scala, показанные в строках 2 и 3 приведённого выше примера кода. Строка 2 преобразуется в вызов apply(Int), а строка 3 преобразуется в вызов update(Int, T).
В scala.Predef существуют два неявных преобразования, которые часто применяются к массивам: преобразование в scala.collection.ArrayOps (показано в строке 4 примера выше) и преобразование в scala.collection.mutable.ArraySeq (подтип scala.collection.Seq). Оба типа предоставляют многие стандартные операции, используемые в API коллекций Scala. Преобразование в ArrayOps временное, поскольку все операции, определённые на ArrayOps возвращают Array, в то время как преобразование в ArraySeq постоянное, поскольку все операции возвращают ArraySeq.
Преобразование в ArrayOps имеет приоритет над преобразованием в ArraySeq. Например, рассмотрите следующий код:
val arr = Array(1, 2, 3) val arrReversed = arr.reverse val seqReversed : collection.Seq[Int] = arr.reverse
Значение arrReversed будет типа Array[Int], с неявным преобразованием в ArrayOps для выполнения операции reverse. Значение seqReversed, с другой стороны, будет вычислено путём преобразования в ArraySeq сначала и вызова варианта reverse, который возвращает другой ArraySeq.
- Since
1.0
- См. также
-
Scala Language Specification, для получения подробной информации о преобразованиях, которые компилятор Scala выполняет для массивов (разделы 6.6 и 6.15 соответственно).
"Scala 2.8 Arrays" — документ Scala Improvement Document, описывающий массивы с версии Scala 2.8.
"The Scala 2.8 Collections' API" раздел о
ArrayМартина Одерски для получения дополнительной информации.
тип ArrayIndexOutOfBoundsException = java.lang.ArrayIndexOutOfBoundsException
тип BigDecimal = scala.math.BigDecimal
тип BigInt = scala.math.BigInt
абстрактный final класс Boolean extends AnyVal
Boolean (эквивалент примитивному типу boolean Java) — подтип scala.AnyVal. Экземпляры Boolean не представлены объектом в базовой системе выполнения.
Существует неявное преобразование из scala.Boolean => scala.runtime.RichBoolean, которое предоставляет полезные операции, отличные от примитивных.
абстрактный final класс Byte extends AnyVal
Byte, 8-битовое знаковое целое число (эквивалент примитивному типу byte Java) — подтип scala.AnyVal. Экземпляры Byte не представлены объектом в базовой системе выполнения.
Существует неявное преобразование из scala.Byte => scala.runtime.RichByte, которое предоставляет полезные операции, отличные от примитивных.
абстрактный final класс Char extends AnyVal
Char, a 16-bit unsigned integer (equivalent to Java's char primitive type) is a subtype of scala.AnyVal. Instances of Char are not represented by an object in the underlying runtime system.
There is an implicit conversion from scala.Char => scala.runtime.RichChar which provides useful non-primitive operations.
type ClassCastException = java.lang.ClassCastException
type Cloneable = java.lang.Cloneable
abstract final class Double extends AnyVal
Double, a 64-bit IEEE-754 floating point number (equivalent to Java's double primitive type) is a subtype of scala.AnyVal. Instances of Double are not represented by an object in the underlying runtime system.
There is an implicit conversion from scala.Double => scala.runtime.RichDouble which provides useful non-primitive operations.
final class DummyImplicit extends AnyRef
trait Dynamic extends Any
A marker trait that enables dynamic invocations. Instances x of this trait allow method invocations x.meth(args) for arbitrary method names meth and argument lists args as well as field accesses x.field for arbitrary field names field.
If a call is not natively supported by x (i.e. if type checking fails), it is rewritten according to the following rules:
foo.method("blah") ~~> foo.applyDynamic("method")("blah")
foo.method(x = "blah") ~~> foo.applyDynamicNamed("method")(("x", "blah"))
foo.method(x = 1, 2) ~~> foo.applyDynamicNamed("method")(("x", 1), ("", 2))
foo.field ~~> foo.selectDynamic("field")
foo.varia = 10 ~~> foo.updateDynamic("varia")(10)
foo.arr(10) = 13 ~~> foo.selectDynamic("arr").update(10, 13)
foo.arr(10) ~~> foo.applyDynamic("arr")(10)
As of Scala 2.10, defining direct or indirect subclasses of this trait is only possible if the language feature dynamics is enabled.
type Either[+A, +B] = scala.util.Either[A, B]
abstract class Enumeration extends Serializable
Defines a finite set of values specific to the enumeration. Typically these values enumerate all possible forms something can take and provide a lightweight alternative to case classes.
Each call to a Value method adds a new unique value to the enumeration. To be accessible, these values are usually defined as val members of the enumeration.
All values in an enumeration share a common, unique type defined as the Value type member of the enumeration (Value selected on the stable identifier path of the enumeration instance).
Values SHOULD NOT be added to an enumeration after its construction; doing so makes the enumeration thread-unsafe. If values are added to an enumeration from multiple threads (in a non-synchronized fashion) after construction, the behavior of the enumeration is undefined.
- Annotations
- @SerialVersionUID()
// Define a new enumeration with a type alias and work with the full set of enumerated values
object WeekDay extends Enumeration {
type WeekDay = Value
val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
}
import WeekDay._
def isWorkingDay(d: WeekDay) = ! (d == Sat || d == Sun)
WeekDay.values filter isWorkingDay foreach println
// output:
// Mon
// Tue
// Wed
// Thu
// Fri,
// Example of adding attributes to an enumeration by extending the Enumeration.Val class
object Planet extends Enumeration {
protected case class Val(mass: Double, radius: Double) extends super.Val {
def surfaceGravity: Double = Planet.G * mass / (radius * radius)
def surfaceWeight(otherMass: Double): Double = otherMass * surfaceGravity
}
import scala.language.implicitConversions
implicit def valueToPlanetVal(x: Value): Val = x.asInstanceOf[Val]
val G: Double = 6.67300E-11
val Mercury = Val(3.303e+23, 2.4397e6)
val Venus = Val(4.869e+24, 6.0518e6)
val Earth = Val(5.976e+24, 6.37814e6)
val Mars = Val(6.421e+23, 3.3972e6)
val Jupiter = Val(1.9e+27, 7.1492e7)
val Saturn = Val(5.688e+26, 6.0268e7)
val Uranus = Val(8.686e+25, 2.5559e7)
val Neptune = Val(1.024e+26, 2.4746e7)
}
println(Planet.values.filter(_.radius > 7.0e6))
// output:
// Planet.ValueSet(Jupiter, Saturn, Uranus, Neptune)
trait Equals extends Any
An interface containing operations for equality. The only method not already present in class AnyRef is canEqual.
type Equiv[T] = scala.math.Equiv[T]
type Error = java.lang.Error
type Exception = java.lang.Exception
abstract final class Float extends AnyVal
Float, a 32-bit IEEE-754 floating point number (equivalent to Java's float primitive type) is a subtype of scala.AnyVal. Instances of Float are not represented by an object in the underlying runtime system.
There is an implicit conversion from scala.Float => scala.runtime.RichFloat which provides useful non-primitive operations.
type Fractional[T] = scala.math.Fractional[T]
trait Function0[+R] extends AnyRef
A function of 0 parameters.
In the following example, the definition of javaVersion is a shorthand for the anonymous class definition anonfun0:
object Main extends App {
val javaVersion = () => sys.props("java.version")
val anonfun0 = new Function0[String] {
def apply(): String = sys.props("java.version")
}
assert(javaVersion() == anonfun0())
}
trait Function1[-T1, +R] extends AnyRef
A function of 1 parameter.
In the following example, the definition of succ is a shorthand for the anonymous class definition anonfun1:
object Main extends App {
val succ = (x: Int) => x + 1
val anonfun1 = new Function1[Int, Int] {
def apply(x: Int): Int = x + 1
}
assert(succ(0) == anonfun1(0))
}
Note that the difference between Function1 and scala.PartialFunction is that the latter can specify inputs which it will not handle.
- Annotations
- @implicitNotFound("No implicit view available from ${T1} => ${R}.")
trait Function10[-T1, -T2, -T3, -T4, -T5, -T6, -T7, -T8, -T9, -T10, +R] extends AnyRef
trait Function11[-T1, -T2, -T3, -T4, -T5, -T6, -T7, -T8, -T9, -T10, -T11, +R] extends AnyRef
trait Function12[-T1, -T2, -T3, -T4, -T5, -T6, -T7, -T8, -T9, -T10, -T11, -T12, +R] extends AnyRef
trait Function13[-T1, -T2, -T3, -T4, -T5, -T6, -T7, -T8, -T9, -T10, -T11, -T12, -T13, +R] extends AnyRef
trait Function14[-T1, -T2, -T3, -T4, -T5, -T6, -T7, -T8, -T9, -T10, -T11, -T12, -T13, -T14, +R] extends AnyRef
trait Function15[-T1, -T2, -T3, -T4, -T5, -T6, -T7, -T8, -T9, -T10, -T11, -T12, -T13, -T14, -T15, +R] extends AnyRef
trait Function16[-T1, -T2, -T3, -T4, -T5, -T6, -T7, -T8, -T9, -T10, -T11, -T12, -T13, -T14, -T15, -T16, +R] extends AnyRef
trait Function17[-T1, -T2, -T3, -T4, -T5, -T6, -T7, -T8, -T9, -T10, -T11, -T12, -T13, -T14, -T15, -T16, -T17, +R] extends AnyRef
trait Function18[-T1, -T2, -T3, -T4, -T5, -T6, -T7, -T8, -T9, -T10, -T11, -T12, -T13, -T14, -T15, -T16, -T17, -T18, +R] extends AnyRef
trait Function19[-T1, -T2, -T3, -T4, -T5, -T6, -T7, -T8, -T9, -T10, -T11, -T12, -T13, -T14, -T15, -T16, -T17, -T18, -T19, +R] extends AnyRef
trait Function2[-T1, -T2, +R] extends AnyRef
Функция с 2 параметрами.
В следующем примере определение max - это сокращенная запись для анонимного определения класса anonfun2:
object Main extends App {
val max = (x: Int, y: Int) => if (x < y) y else x
val anonfun2 = new Function2[Int, Int, Int] {
def apply(x: Int, y: Int): Int = if (x < y) y else x
}
assert(max(0, 1) == anonfun2(0, 1))
}
trait Function20[-T1, -T2, -T3, -T4, -T5, -T6, -T7, -T8, -T9, -T10, -T11, -T12, -T13, -T14, -T15, -T16, -T17, -T18, -T19, -T20, +R] extends AnyRef
trait Function21[-T1, -T2, -T3, -T4, -T5, -T6, -T7, -T8, -T9, -T10, -T11, -T12, -T13, -T14, -T15, -T16, -T17, -T18, -T19, -T20, -T21, +R] extends AnyRef
trait Function22[-T1, -T2, -T3, -T4, -T5, -T6, -T7, -T8, -T9, -T10, -T11, -T12, -T13, -T14, -T15, -T16, -T17, -T18, -T19, -T20, -T21, -T22, +R] extends AnyRef
trait Function3[-T1, -T2, -T3, +R] extends AnyRef
trait Function4[-T1, -T2, -T3, -T4, +R] extends AnyRef
trait Function5[-T1, -T2, -T3, -T4, -T5, +R] extends AnyRef
trait Function6[-T1, -T2, -T3, -T4, -T5, -T6, +R] extends AnyRef
trait Function7[-T1, -T2, -T3, -T4, -T5, -T6, -T7, +R] extends AnyRef
trait Function8[-T1, -T2, -T3, -T4, -T5, -T6, -T7, -T8, +R] extends AnyRef
trait Function9[-T1, -T2, -T3, -T4, -T5, -T6, -T7, -T8, -T9, +R] extends AnyRef
type IllegalArgumentException = java.lang.IllegalArgumentException
type IndexOutOfBoundsException = java.lang.IndexOutOfBoundsException
type IndexedSeq[+A] = scala.collection.immutable.IndexedSeq[A]
- Annotations
- @migration
- Миграция
(Изменено в версии 2.13.0) scala.IndexedSeq теперь является scala.collection.immutable.IndexedSeq вместо scala.collection.IndexedSeq
abstract final class Int extends AnyVal
Целое число Int, 32-битное со знаком (эквивалентно примитивному типу Java int), является подтипом scala.AnyVal. Экземпляры Int не представлены объектом в подлежащей среде выполнения.
Существует неявное преобразование из scala.Int => scala.runtime.RichInt, которое предоставляет полезные операции, отличные от примитивных.
type Integral[T] = scala.math.Integral[T]
type InterruptedException = java.lang.InterruptedException
type Iterable[+A] = scala.collection.Iterable[A]
type IterableOnce[+A] = scala.collection.IterableOnce[A]
type Iterator[+A] = scala.collection.Iterator[A]
type LazyList[+A] = scala.collection.immutable.LazyList[A]
type Left[+A, +B] = scala.util.Left[A, B]
type List[+A] = scala.collection.immutable.List[A]
abstract final class Long extends AnyVal
Long, 64-битное знаковое целое число (эквивалентно примитивному типу Java long) — подтип scala.AnyVal.
Экземпляры Long не представлены объектом в подлежащей среде выполнения.
Существует неявное преобразование из scala.Long => scala.runtime.RichLong, предоставляющее полезные операции, не связанные с примитивами.
final class MatchError extends RuntimeException
Этот класс реализует ошибки, которые выбрасываются всякий раз, когда объект не соответствует ни одному шаблону в выражении сопоставления с образцом.
- Since
2.0
type NoSuchElementException = java.util.NoSuchElementException
final class NotImplementedError extends Error
Выбрасывание этого исключения может служить временной заменой тела метода, которое ещё не реализовано. Например, это исключение выбрасывает Predef.???.
abstract final class Nothing extends Any
Nothing — вместе с scala.Null — находится в основании иерархии типов Scala.
Nothing является подтипом любого другого типа (включая scala.Null); экземпляров этого типа не существует. Хотя тип Nothing необитаем, он тем не менее полезен в нескольких случаях. Например, в библиотеке Scala определена константа scala.collection.immutable.Nil типа List[Nothing]. Поскольку списки в Scala ковариантны, это делает scala.collection.immutable.Nil экземпляром List[T], для любого элемента типа T.
Ещё одно применение типа Nothing — это тип возвращаемого значения для методов, которые никогда не возвращают значения обычным образом. Примером является метод error в scala.sys, который всегда выбрасывает исключение.
abstract final class Null extends AnyRef
Null — вместе с scala.Nothing — находится в основании иерархии типов Scala.
Null является подтипом всех ссылочных типов; его единственным экземпляром является ссылка null. Поскольку Null не является подтипом типов значений, null не является членом ни одного такого типа. Например, нельзя присвоить null переменной типа scala.Int.
type NullPointerException = java.lang.NullPointerException
type NumberFormatException = java.lang.NumberFormatException
type Numeric[T] = scala.math.Numeric[T]
sealed abstract class Option[+A] extends IterableOnce[A] with Product with Serializable
Представляет необязательные значения. Экземпляры Option являются либо экземпляром scala.Some, либо объектом None.
Наиболее распространенный способ использования экземпляра scala.Option — это рассматривать его как коллекцию или монаду и использовать map, flatMap, filter, или foreach:
val name: Option[String] = request getParameter "name"
val upper = name map { _.trim } filter { _.length != 0 } map { _.toUpperCase }
println(upper getOrElse "")
Обратите внимание, что это эквивалентно
val upper = for {
name <- request getParameter "name"
trimmed <- Some(name.trim)
upper <- Some(trimmed.toUpperCase) if trimmed.length != 0
} yield upper
println(upper getOrElse "")
Из-за того, как работает понимание for, если None возвращается из request.getParameter, все выражение приведёт к None
Это позволяет создавать сложные цепочки значений scala.Option без необходимости проверки существования значения.
Эти полезные методы существуют как для scala.Some, так и для None.
-
isDefined — Истина, если не пусто
isEmpty — Истина, если пусто
nonEmpty — Истина, если не пусто
orElse — Оценить и вернуть альтернативное необязательное значение, если пусто
getOrElse — Оценить и вернуть альтернативное значение, если пусто
get — Возвратить значение, выбросить исключение, если пусто
fold — Применить функцию к необязательному значению, вернуть значение по умолчанию, если пусто
map — Применить функцию к необязательному значению
flatMap — То же, что и map, но функция должна возвращать необязательное значение
foreach — Применить процедуру к значению Option
collect — Применить частичное сопоставление шаблонов к необязательному значению
filter — Значение Option удовлетворяет предикату
filterNot — Значение Option не удовлетворяет предикату
exists — Применить предикат к значению Option, иначе возвращает false, если пусто
forall — Применить предикат к значению Option, иначе возвращает true, если пусто
contains — Проверяет, равно ли значение значению Option, иначе возвращает false, если пусто
zip — Объединить два необязательных значения для создания парного необязательного значения
unzip — Разделить пару Option на два необязательных значения
unzip3 — Разделить тройку Option на три необязательных значения
toList — Одноэлементный список необязательного значения, в противном случае пустой список
Менее распространенный способ использования значений scala.Option — через сопоставление шаблонов:
val nameMaybe = request getParameter "name"
nameMaybe match {
case Some(name) =>
println(name.trim.toUppercase)
case None =>
println("No name value")
}
Взаимодействие с кодом, который иногда может возвращать null, безопасно оборачивается в scala.Option, чтобы стать None, а иначе scala.Some.
val abc = new java.util.HashMap[Int, String]
abc.put(1, "A")
bMaybe = Option(abc.get(2))
bMaybe match {
case Some(b) =>
println(s"Found $b")
case None =>
println("Not found")
}
- Аннотации
- @SerialVersionUID()
- С
1.1
- Примечание
Многие методы здесь дублируют методы в иерархии Traversable, но они дублируются по причине: неявное преобразование, как правило, приводит к Iterable в ситуациях, когда можно было бы сохранить Option.
тип Ordered[T] = scala.math.Ordered[T]
тип Ordering[T] = scala.math.Ordering[T]
тракт PartialFunction[-A, +B] extends (A) => B
Частичная функция типа PartialFunction[A, B] — это унарная функция, где область значений не обязательно включает все значения типа A. Функция isDefinedAt позволяет динамически проверить, находится ли значение в области значений функции.
Даже если isDefinedAt возвращает true для a: A, вызов apply(a) всё ещё может выбросить исключение, поэтому следующий код допустим:
val f: PartialFunction[Int, Any] = { case _ => 1/0 }
Ответственность за вызов isDefinedAt перед вызовом apply лежит на вызывающей стороне, потому что если isDefinedAt ложно, то не гарантируется, что apply выбросит исключение для указания состояния ошибки. Если исключение не выброшено, оценка может привести к произвольному значению.
Основное отличие между PartialFunction и scala.Function1 заключается в том, что пользователь PartialFunction может выбрать выполнение других действий с вводом, который объявлен вне его области определения. Например:
val sample = 1 to 10
val isEven: PartialFunction[Int, String] = {
case x if x % 2 == 0 => x+" is even"
}
// the method collect can use isDefinedAt to select which members to collect
val evenNumbers = sample collect isEven
val isOdd: PartialFunction[Int, String] = {
case x if x % 2 == 1 => x+" is odd"
}
// the method orElse allows chaining another partial function to handle
// input outside the declared domain
val numbers = sample map (isEven orElse isOdd)
- С
1.0
- Примечание
Необязательные функции Function, PartialFunction и объекты-экстракторы могут быть преобразованы друг в друга, как показано в следующей таблице. | Как преобразовать... | в функцию PartialFunction | в необязательную функцию Function | в экстрактор | | :---: | --- | --- | --- | | из функции PartialFunction | Predef.identity | lift | Predef.identity | | из необязательной функции Function | Function.UnliftOps#unlift или Function.unlift | Predef.identity | Function.UnliftOps#unlift | | из экстрактора |
{ case extractor(x) => x }|extractor.unapply _| Predef.identity |
тип PartialOrdering[T] = scala.math.PartialOrdering[T]
тип PartiallyOrdered[T] = scala.math.PartiallyOrdered[T]
тракт Product extends Equals
Базовый трейт для всех продуктов, которые в стандартной библиотеке включают по крайней мере scala.Product1 до scala.Product22 и, следовательно, также их подклассы scala.Tuple1 до scala.Tuple22. Кроме того, все case-классы реализуют Product с синтетически генерируемыми методами.
- Since
2.3
trait Product1[+T1] extends Product
Product1 is a Cartesian product of 1 component.
- Since
2.3
trait Product10[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8, +T9, +T10] extends Product
Product10 is a Cartesian product of 10 components.
- Since
2.3
trait Product11[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8, +T9, +T10, +T11] extends Product
Product11 is a Cartesian product of 11 components.
- Since
2.3
trait Product12[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8, +T9, +T10, +T11, +T12] extends Product
Product12 is a Cartesian product of 12 components.
- Since
2.3
trait Product13[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8, +T9, +T10, +T11, +T12, +T13] extends Product
Product13 is a Cartesian product of 13 components.
- Since
2.3
trait Product14[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8, +T9, +T10, +T11, +T12, +T13, +T14] extends Product
Product14 is a Cartesian product of 14 components.
- Since
2.3
trait Product15[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8, +T9, +T10, +T11, +T12, +T13, +T14, +T15] extends Product
Product15 is a Cartesian product of 15 components.
- Since
2.3
trait Product16[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8, +T9, +T10, +T11, +T12, +T13, +T14, +T15, +T16] extends Product
Product16 is a Cartesian product of 16 components.
- Since
2.3
trait Product17[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8, +T9, +T10, +T11, +T12, +T13, +T14, +T15, +T16, +T17] extends Product
Product17 is a Cartesian product of 17 components.
- Since
2.3
trait Product18[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8, +T9, +T10, +T11, +T12, +T13, +T14, +T15, +T16, +T17, +T18] extends Product
Product18 is a Cartesian product of 18 components.
- Since
2.3
trait Product19[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8, +T9, +T10, +T11, +T12, +T13, +T14, +T15, +T16, +T17, +T18, +T19] extends Product
Product19 is a Cartesian product of 19 components.
- Since
2.3
trait Product2[+T1, +T2] extends Product
Product2 — это декартово произведение 2 компонентов.
- Since
2.3
trait Product20[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8, +T9, +T10, +T11, +T12, +T13, +T14, +T15, +T16, +T17, +T18, +T19, +T20] extends Product
Product20 — это декартово произведение 20 компонентов.
- Since
2.3
trait Product21[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8, +T9, +T10, +T11, +T12, +T13, +T14, +T15, +T16, +T17, +T18, +T19, +T20, +T21] extends Product
Product21 — это декартово произведение 21 компонента.
- Since
2.3
trait Product22[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8, +T9, +T10, +T11, +T12, +T13, +T14, +T15, +T16, +T17, +T18, +T19, +T20, +T21, +T22] extends Product
Product22 — это декартово произведение 22 компонентов.
- Since
2.3
trait Product3[+T1, +T2, +T3] extends Product
Product3 — это декартово произведение 3 компонентов.
- Since
2.3
trait Product4[+T1, +T2, +T3, +T4] extends Product
Product4 — это декартово произведение 4 компонентов.
- Since
2.3
trait Product5[+T1, +T2, +T3, +T4, +T5] extends Product
Product5 — это декартово произведение 5 компонентов.
- Since
2.3
trait Product6[+T1, +T2, +T3, +T4, +T5, +T6] extends Product
Product6 — это декартово произведение 6 компонентов.
- Since
2.3
trait Product7[+T1, +T2, +T3, +T4, +T5, +T6, +T7] extends Product
Product7 — это декартово произведение 7 компонентов.
- Since
2.3
trait Product8[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8] extends Product
Product8 — это декартово произведение 8 компонентов.
- Since
2.3
trait Product9[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8, +T9] extends Product
Product9 — это декартово произведение 9 компонентов.
- Since
2.3
type Range = scala.collection.immutable.Range
type Right[+A, +B] = scala.util.Right[A, B]
type RuntimeException = java.lang.RuntimeException
case class ScalaReflectionException(msg: String) extends Exception with Product with Serializable
type Seq[+A] = scala.collection.immutable.Seq[A]
- Annotations
- @migration
- Migration
(Изменено в версии 2.13.0) scala.Seq теперь scala.collection.immutable.Seq вместо scala.collection.Seq
класс SerialVersionUID extends Annotation with ConstantAnnotation
Аннотация для указания поля serialVersionUID (сериализуемого) класса.
В JVM, класс с этой аннотацией получит поле serialVersionUID, private, и static, названное serialVersionUID, со значением, указанным в value, которое механизм сериализации JVM использует для определения совместимости сериализации между различными версиями класса.
- Аннотации
- @deprecatedInheritance("Планируется сделать final в 2.14", "2.13.0")
- См. также
тип Serializable = java.io.Serializable
абстрактный final класс Short extends AnyVal
Short, 16-битное знаковое целое число (эквивалентный примитивному типу short Java) является подтипом scala.AnyVal. Экземпляры Short не представлены объектом в базовой системе времени выполнения.
Существует неявное преобразование из scala.Short => scala.runtime.RichShort, которое предоставляет полезные не-примитивные операции.
final трайт Singleton extends Any
Singleton используется компилятором в качестве супертипа для одиночных типов. Это включает в себя литеральные типы, так как они также являются одиночными типами.
scala> object A { val x = 42 }
defined object A
scala> implicitly[A.type <:< Singleton]
res12: A.type <:< Singleton = generalized constraint
scala> implicitly[A.x.type <:< Singleton]
res13: A.x.type <:< Singleton = generalized constraint
scala> implicitly[42 <:< Singleton]
res14: 42 <:< Singleton = generalized constraint
scala> implicitly[Int <:< Singleton]
^
error: Cannot prove that Int <:< Singleton.
Singleton имеет специальное значение, когда появляется в качестве верхнего ограничения формального параметра типа. Обычно, вывод типов в Scala расширяет одиночные типы до базового не-одиночного типа. Когда параметр типа имеет явное верхнее ограничение Singleton, компилятор выводит одиночный тип.
scala> def check42[T](x: T)(implicit ev: T =:= 42): T = x check42: [T](x: T)(implicit ev: T =:= 42)T scala> val x1 = check42(42) ^ error: Cannot prove that Int =:= 42. scala> def singleCheck42[T <: Singleton](x: T)(implicit ev: T =:= 42): T = x singleCheck42: [T <: Singleton](x: T)(implicit ev: T =:= 42)T scala> val x2 = singleCheck42(42) x2: Int = 42
См. также SIP-23 о литеральных одиночных типах.
final случайный класс Some[+A](value: A) extends Option[A] with Product with Serializable
Класс Some[A] представляет существующие значения типа A.
- Аннотации
- @SerialVersionUID()
- С
1.0
трайт Specializable extends AnyRef
Общий супертип для компаньонов специализируемых типов. Не следует расширять в пользовательском коде.
тип StringBuilder = scala.collection.mutable.StringBuilder
случайный класс StringContext(parts: String*) extends Product with Serializable
Этот класс предоставляет базовый механизм для интерполяции строк. Интерполяция строк позволяет пользователям встраивать ссылки на переменные непосредственно в *обработанные* строковые литералы. Вот пример:
val name = "James" println(s"Hello, $name") // Hello, James
Любой обработанный строковый литерал переписывается как создание экземпляра и вызов метода этого класса. Например:
s"Hello, $name"
переписывается как:
StringContext("Hello, ", "").s(name)
По умолчанию, этот класс предоставляет методы raw, s и f в качестве доступных интерполяторов.
Чтобы предоставить свой собственный интерполятор строк, создайте неявный класс, который добавляет метод к StringContext. Вот пример:
implicit class JsonHelper(private val sc: StringContext) extends AnyVal {
def json(args: Any*): JSONObject = ...
}
val x: JSONObject = json"{ a: $a }"
Здесь класс расширения JsonHelper неявно добавляет метод json к StringContext, который может использоваться для json строковых литералов.
- parts
Части, составляющие интерполированную строку, без выражений, которые вставляются интерполяцией.
- С
2.10.0
тип StringIndexOutOfBoundsException = java.lang.StringIndexOutOfBoundsException
final класс Symbol extends Serializable
Этот класс предоставляет простой способ получения уникальных объектов для равных строк. Поскольку символы интернированы, их можно сравнивать с помощью равенства ссылок. Экземпляры Symbol могут быть легко созданы с помощью встроенного механизма цитирования Scala.
Например, терм Scala 'mysym вызовет конструктор класса Symbol следующим образом: Symbol("mysym").
- С
1.7
тип Throwable = java.lang.Throwable
final случайный класс Tuple1[+T1](_1: T1) extends Product1[T1] with Product with Serializable
Кортеж из 1 элемента; каноническое представление scala.Product1.
- _1
Элемент 1 этого Tuple1
final case class Tuple10[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8, +T9, +T10](_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8, _9: T9, _10: T10) extends Product10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10] with Product with Serializable
Кортеж из 10 элементов; каноническое представление scala.Product10.
- _1
Элемент 1 этого Tuple10
- _2
Элемент 2 этого Tuple10
- _3
Элемент 3 этого Tuple10
- _4
Элемент 4 этого Tuple10
- _5
Элемент 5 этого Tuple10
- _6
Элемент 6 этого Tuple10
- _7
Элемент 7 этого Tuple10
- _8
Элемент 8 этого Tuple10
- _9
Элемент 9 этого Tuple10
- _10
Элемент 10 этого Tuple10
final case class Tuple11[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8, +T9, +T10, +T11](_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8, _9: T9, _10: T10, _11: T11) extends Product11[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11] with Product with Serializable
Кортеж из 11 элементов; каноническое представление scala.Product11.
- _1
Элемент 1 этого Tuple11
- _2
Элемент 2 этого Tuple11
- _3
Элемент 3 этого Tuple11
- _4
Элемент 4 этого Tuple11
- _5
Элемент 5 этого Tuple11
- _6
Элемент 6 этого Tuple11
- _7
Элемент 7 этого Tuple11
- _8
Элемент 8 этого Tuple11
- _9
Элемент 9 этого Tuple11
- _10
Элемент 10 этого Tuple11
- _11
Элемент 11 этого Tuple11
final case class Tuple12[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8, +T9, +T10, +T11, +T12](_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8, _9: T9, _10: T10, _11: T11, _12: T12) extends Product12[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12] with Product with Serializable
Кортеж из 12 элементов; каноническое представление scala.Product12.
- _1
Элемент 1 этого Tuple12
- _2
Элемент 2 этого Tuple12
- _3
Элемент 3 этого Tuple12
- _4
Элемент 4 этого Tuple12
- _5
Элемент 5 этого Tuple12
- _6
Элемент 6 этого Tuple12
- _7
Элемент 7 этого Tuple12
- _8
Элемент 8 этого Tuple12
- _9
Элемент 9 этого Tuple12
- _10
Элемент 10 этого Tuple12
- _11
Элемент 11 этого Tuple12
- _12
Элемент 12 этого Tuple12
final case class Tuple13[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8, +T9, +T10, +T11, +T12, +T13](_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8, _9: T9, _10: T10, _11: T11, _12: T12, _13: T13) extends Product13[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13] with Product with Serializable
Кортеж из 13 элементов; каноническое представление scala.Product13.
- _1
Элемент 1 этого Tuple13
- _2
Элемент 2 этого Tuple13
- _3
Элемент 3 этого Tuple13
- _4
Элемент 4 этого Tuple13
- _5
Элемент 5 этого Tuple13
- _6
Элемент 6 этого Tuple13
- _7
Элемент 7 этого Tuple13
- _8
Элемент 8 этого Tuple13
- _9
Элемент 9 этого Tuple13
- _10
Элемент 10 этого Tuple13
- _11
Элемент 11 этого Tuple13
- _12
Элемент 12 этого Tuple13
- _13
Элемент 13 этого Tuple13
final case class Tuple14[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8, +T9, +T10, +T11, +T12, +T13, +T14](_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8, _9: T9, _10: T10, _11: T11, _12: T12, _13: T13, _14: T14) extends Product14[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14] with Product with Serializable
Кортеж из 14 элементов; каноническое представление scala.Product14.
- _1
Элемент 1 этого Tuple14
- _2
Элемент 2 этого Tuple14
- _3
Элемент 3 этого Tuple14
- _4
Элемент 4 этого Tuple14
- _5
Элемент 5 этого Tuple14
- _6
Элемент 6 этого Tuple14
- _7
Элемент 7 этого Tuple14
- _8
Элемент 8 этого Tuple14
- _9
Элемент 9 этого Tuple14
- _10
Элемент 10 этого Tuple14
- _11
Элемент 11 этого Tuple14
- _12
Элемент 12 этого Tuple14
- _13
Элемент 13 этого Tuple14
- _14
Элемент 14 этого Tuple14
final кортеж Tuple15[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8, +T9, +T10, +T11, +T12, +T13, +T14, +T15](_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8, _9: T9, _10: T10, _11: T11, _12: T12, _13: T13, _14: T14, _15: T15) extends Product15[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15] with Product with Serializable
Кортеж из 15 элементов; каноническое представление scala.Product15.
- _1
Элемент 1 этого Tuple15
- _2
Элемент 2 этого Tuple15
- _3
Элемент 3 этого Tuple15
- _4
Элемент 4 этого Tuple15
- _5
Элемент 5 этого Tuple15
- _6
Элемент 6 этого Tuple15
- _7
Элемент 7 этого Tuple15
- _8
Элемент 8 этого Tuple15
- _9
Элемент 9 этого Tuple15
- _10
Элемент 10 этого Tuple15
- _11
Элемент 11 этого Tuple15
- _12
Элемент 12 этого Tuple15
- _13
Элемент 13 этого Tuple15
- _14
Элемент 14 этого Tuple15
- _15
Элемент 15 этого Tuple15
final кортеж Tuple16[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8, +T9, +T10, +T11, +T12, +T13, +T14, +T15, +T16](_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8, _9: T9, _10: T10, _11: T11, _12: T12, _13: T13, _14: T14, _15: T15, _16: T16) extends Product16[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16] with Product with Serializable
Кортеж из 16 элементов; каноническое представление scala.Product16.
- _1
Элемент 1 этого Tuple16
- _2
Элемент 2 этого Tuple16
- _3
Элемент 3 этого Tuple16
- _4
Элемент 4 этого Tuple16
- _5
Элемент 5 этого Tuple16
- _6
Элемент 6 этого Tuple16
- _7
Элемент 7 этого Tuple16
- _8
Элемент 8 этого Tuple16
- _9
Элемент 9 этого Tuple16
- _10
Элемент 10 этого Tuple16
- _11
Элемент 11 этого Tuple16
- _12
Элемент 12 этого Tuple16
- _13
Элемент 13 этого Tuple16
- _14
Элемент 14 этого Tuple16
- _15
Элемент 15 этого Tuple16
- _16
Элемент 16 этого Tuple16
final case class Tuple17[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8, +T9, +T10, +T11, +T12, +T13, +T14, +T15, +T16, +T17](_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8, _9: T9, _10: T10, _11: T11, _12: T12, _13: T13, _14: T14, _15: T15, _16: T16, _17: T17) extends Product17[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17] with Product with Serializable
Кортеж из 17 элементов; каноническое представление scala.Product17.
- _1
Элемент 1 этого Tuple17
- _2
Элемент 2 этого Tuple17
- _3
Элемент 3 этого Tuple17
- _4
Элемент 4 этого Tuple17
- _5
Элемент 5 этого Tuple17
- _6
Элемент 6 этого Tuple17
- _7
Элемент 7 этого Tuple17
- _8
Элемент 8 этого Tuple17
- _9
Элемент 9 этого Tuple17
- _10
Элемент 10 этого Tuple17
- _11
Элемент 11 этого Tuple17
- _12
Элемент 12 этого Tuple17
- _13
Элемент 13 этого Tuple17
- _14
Элемент 14 этого Tuple17
- _15
Элемент 15 этого Tuple17
- _16
Элемент 16 этого Tuple17
- _17
Элемент 17 этого Tuple17
final case class Tuple18[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8, +T9, +T10, +T11, +T12, +T13, +T14, +T15, +T16, +T17, +T18](_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8, _9: T9, _10: T10, _11: T11, _12: T12, _13: T13, _14: T14, _15: T15, _16: T16, _17: T17, _18: T18) extends Product18[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18] with Product with Serializable
Кортеж из 18 элементов; каноническое представление scala.Product18.
- _1
Элемент 1 этого Tuple18
- _2
Элемент 2 этого Tuple18
- _3
Элемент 3 этого Tuple18
- _4
Элемент 4 этого Tuple18
- _5
Элемент 5 этого Tuple18
- _6
Элемент 6 этого Tuple18
- _7
Элемент 7 этого Tuple18
- _8
Элемент 8 этого Tuple18
- _9
Элемент 9 этого Tuple18
- _10
Элемент 10 этого Tuple18
- _11
Элемент 11 этого Tuple18
- _12
Элемент 12 этого Tuple18
- _13
Элемент 13 этого Tuple18
- _14
Элемент 14 этого Tuple18
- _15
Элемент 15 этого Tuple18
- _16
Элемент 16 этого Tuple18
- _17
Элемент 17 этого Tuple18
- _18
Элемент 18 этого Tuple18
final кортеж-класс Tuple19[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8, +T9, +T10, +T11, +T12, +T13, +T14, +T15, +T16, +T17, +T18, +T19](_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8, _9: T9, _10: T10, _11: T11, _12: T12, _13: T13, _14: T14, _15: T15, _16: T16, _17: T17, _18: T18, _19: T19) extends Product19[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19] with Product with Serializable
Кортеж из 19 элементов; каноническое представление scala.Product19.
- _1
Элемент 1 этого Tuple19
- _2
Элемент 2 этого Tuple19
- _3
Элемент 3 этого Tuple19
- _4
Элемент 4 этого Tuple19
- _5
Элемент 5 этого Tuple19
- _6
Элемент 6 этого Tuple19
- _7
Элемент 7 этого Tuple19
- _8
Элемент 8 этого Tuple19
- _9
Элемент 9 этого Tuple19
- _10
Элемент 10 этого Tuple19
- _11
Элемент 11 этого Tuple19
- _12
Элемент 12 этого Tuple19
- _13
Элемент 13 этого Tuple19
- _14
Элемент 14 этого Tuple19
- _15
Элемент 15 этого Tuple19
- _16
Элемент 16 этого Tuple19
- _17
Элемент 17 этого Tuple19
- _18
Элемент 18 этого Tuple19
- _19
Элемент 19 этого Tuple19
final кортеж-класс Tuple2[+T1, +T2](_1: T1, _2: T2) extends Product2[T1, T2] with Product with Serializable
Кортеж из 2 элементов; каноническое представление scala.Product2.
- _1
Элемент 1 этого Tuple2
- _2
Элемент 2 этого Tuple2
final кортеж-класс Tuple20[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8, +T9, +T10, +T11, +T12, +T13, +T14, +T15, +T16, +T17, +T18, +T19, +T20](_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8, _9: T9, _10: T10, _11: T11, _12: T12, _13: T13, _14: T14, _15: T15, _16: T16, _17: T17, _18: T18, _19: T19, _20: T20) extends Product20[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20] with Product with Serializable
Кортеж из 20 элементов; каноническое представление scala.Product20.
- _1
Элемент 1 этого Tuple20
- _2
Элемент 2 этого Tuple20
- _3
Элемент 3 этого Tuple20
- _4
Элемент 4 этого Tuple20
- _5
Элемент 5 этого Tuple20
- _6
Элемент 6 этого Tuple20
- _7
Элемент 7 этого Tuple20
- _8
Элемент 8 этого Tuple20
- _9
Элемент 9 этого Tuple20
- _10
Элемент 10 этого Tuple20
- _11
Элемент 11 этого Tuple20
- _12
Элемент 12 этого Tuple20
- _13
Элемент 13 этого Tuple20
- _14
Элемент 14 этого Tuple20
- _15
Элемент 15 этого Tuple20
- _16
Элемент 16 этого Tuple20
- _17
Элемент 17 этого Tuple20
- _18
Элемент 18 этого Tuple20
- _19
Элемент 19 этого Tuple20
- _20
Элемент 20 этого Tuple20
final case class Tuple21[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8, +T9, +T10, +T11, +T12, +T13, +T14, +T15, +T16, +T17, +T18, +T19, +T20, +T21](_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8, _9: T9, _10: T10, _11: T11, _12: T12, _13: T13, _14: T14, _15: T15, _16: T16, _17: T17, _18: T18, _19: T19, _20: T20, _21: T21) extends Product21[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21] with Product with Serializable
Кортеж из 21 элемента; каноническое представление scala.Product21.
- _1
Элемент 1 этого Tuple21
- _2
Элемент 2 этого Tuple21
- _3
Элемент 3 этого Tuple21
- _4
Элемент 4 этого Tuple21
- _5
Элемент 5 этого Tuple21
- _6
Элемент 6 этого Tuple21
- _7
Элемент 7 этого Tuple21
- _8
Элемент 8 этого Tuple21
- _9
Элемент 9 этого Tuple21
- _10
Элемент 10 этого Tuple21
- _11
Элемент 11 этого Tuple21
- _12
Элемент 12 этого Tuple21
- _13
Элемент 13 этого Tuple21
- _14
Элемент 14 этого Tuple21
- _15
Элемент 15 этого Tuple21
- _16
Элемент 16 этого Tuple21
- _17
Элемент 17 этого Tuple21
- _18
Элемент 18 этого Tuple21
- _19
Элемент 19 этого Tuple21
- _20
Элемент 20 этого Tuple21
- _21
Элемент 21 этого Tuple21
final case class Tuple22[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8, +T9, +T10, +T11, +T12, +T13, +T14, +T15, +T16, +T17, +T18, +T19, +T20, +T21, +T22](_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8, _9: T9, _10: T10, _11: T11, _12: T12, _13: T13, _14: T14, _15: T15, _16: T16, _17: T17, _18: T18, _19: T19, _20: T20, _21: T21, _22: T22) extends Product22[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22] with Product with Serializable
Кортеж из 22 элементов; каноническое представление scala.Product22.
- _1
Элемент 1 этого Tuple22
- _2
Элемент 2 этого Tuple22
- _3
Элемент 3 этого Tuple22
- _4
Элемент 4 этого Tuple22
- _5
Элемент 5 этого Tuple22
- _6
Элемент 6 этого Tuple22
- _7
Элемент 7 этого Tuple22
- _8
Элемент 8 этого Tuple22
- _9
Элемент 9 этого Tuple22
- _10
Элемент 10 этого Tuple22
- _11
Элемент 11 этого Tuple22
- _12
Элемент 12 этого Tuple22
- _13
Элемент 13 этого Tuple22
- _14
Элемент 14 этого Tuple22
- _15
Элемент 15 этого Tuple22
- _16
Элемент 16 этого Tuple22
- _17
Элемент 17 этого Tuple22
- _18
Элемент 18 этого Tuple22
- _19
Элемент 19 этого Tuple22
- _20
Элемент 20 этого Tuple22
- _21
Элемент 21 этого Tuple22
- _22
Элемент 22 этого Tuple22
final case class Tuple3[+T1, +T2, +T3](_1: T1, _2: T2, _3: T3) extends Product3[T1, T2, T3] with Product with Serializable
Кортеж из 3 элементов; каноническое представление scala.Product3.
- _1
Элемент 1 этого Tuple3
- _2
Элемент 2 этого Tuple3
- _3
Элемент 3 этого Tuple3
final case class Tuple4[+T1, +T2, +T3, +T4](_1: T1, _2: T2, _3: T3, _4: T4) extends Product4[T1, T2, T3, T4] with Product with Serializable
Кортеж из 4 элементов; каноническое представление scala.Product4.
- _1
Элемент 1 этого Tuple4
- _2
Элемент 2 этого Tuple4
- _3
Элемент 3 этого Tuple4
- _4
Элемент 4 этого Tuple4
final case class Tuple5[+T1, +T2, +T3, +T4, +T5](_1: T1, _2: T2, _3: T3, _4: T4, _5: T5) extends Product5[T1, T2, T3, T4, T5] with Product with Serializable
Кортеж из 5 элементов; каноническое представление scala.Product5.
- _1
Элемент 1 этого Tuple5
- _2
Элемент 2 этого Tuple5
- _3
Элемент 3 этого Tuple5
- _4
Элемент 4 этого Tuple5
- _5
Элемент 5 этого Tuple5
final case class Tuple6[+T1, +T2, +T3, +T4, +T5, +T6](_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6) extends Product6[T1, T2, T3, T4, T5, T6] with Product with Serializable
Кортеж из 6 элементов; каноническое представление scala.Product6.
- _1
Элемент 1 этого Tuple6
- _2
Элемент 2 этого Tuple6
- _3
Элемент 3 этого Tuple6
- _4
Элемент 4 этого Tuple6
- _5
Элемент 5 этого Tuple6
- _6
Элемент 6 этого Tuple6
final case class Tuple7[+T1, +T2, +T3, +T4, +T5, +T6, +T7](_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7) extends Product7[T1, T2, T3, T4, T5, T6, T7] with Product with Serializable
Кортеж из 7 элементов; каноническое представление scala.Product7.
- _1
Элемент 1 этого Tuple7
- _2
Элемент 2 этого Tuple7
- _3
Элемент 3 этого Tuple7
- _4
Элемент 4 этого Tuple7
- _5
Элемент 5 этого Tuple7
- _6
Элемент 6 этого Tuple7
- _7
Элемент 7 этого Tuple7
final case class Tuple8[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8](_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8) extends Product8[T1, T2, T3, T4, T5, T6, T7, T8] with Product with Serializable
Кортеж из 8 элементов; каноническое представление scala.Product8.
- _1
Элемент 1 этого Tuple8
- _2
Элемент 2 этого Tuple8
- _3
Элемент 3 этого Tuple8
- _4
Элемент 4 этого Tuple8
- _5
Элемент 5 этого Tuple8
- _6
Элемент 6 этого Tuple8
- _7
Элемент 7 этого Tuple8
- _8
Элемент 8 этого Tuple8
final case class Tuple9[+T1, +T2, +T3, +T4, +T5, +T6, +T7, +T8, +T9](_1: T1, _2: T2, _3: T3, _4: T4, _5: T5, _6: T6, _7: T7, _8: T8, _9: T9) extends Product9[T1, T2, T3, T4, T5, T6, T7, T8, T9] with Product with Serializable
Кортеж из 9 элементов; каноническое представление scala.Product9.
- _1
Элемент 1 этого Tuple9
- _2
Элемент 2 этого Tuple9
- _3
Элемент 3 этого Tuple9
- _4
Элемент 4 этого Tuple9
- _5
Элемент 5 этого Tuple9
- _6
Элемент 6 этого Tuple9
- _7
Элемент 7 этого Tuple9
- _8
Элемент 8 этого Tuple9
- _9
Элемент 9 этого Tuple9
final case class UninitializedFieldError(msg: String) extends RuntimeException with Product with Serializable
Этот класс реализует ошибки, которые выбрасываются всякий раз, когда поле используется до его инициализации.
Такие проверки во время выполнения не включаются по умолчанию. Их можно включить с помощью опции компилятора -Xcheckinit.
- Since
2.7
abstract final class Unit extends AnyVal
Unit является подтипом scala.AnyVal. Существует только одно значение типа Unit, (), и оно не представлено каким-либо объектом в базовой среде выполнения. Метод с типом возвращаемого значения Unit аналогичен методу Java, который объявлен void.
type UnsupportedOperationException = java.lang.UnsupportedOperationException
final class ValueOf[T] extends AnyVal
ValueOf[T] предоставляет единственное значение типа T, где T — тип, имеющий единственного представителя. Квалифицируемые типы — это одиночные типы вида stablePath.type, Unit и одиночные типы, соответствующие литералам значений.
Экземпляры ValueOf[T] предоставляются неявно для всех допустимых типов. Обычно экземпляр требуется, когда необходимо значение времени выполнения, соответствующее вычислению на уровне типов.
Например, мы можем определить тип Residue[M <: Int], соответствующий группе целых чисел по модулю M. Мы можем затем потребовать, чтобы остатки могли суммироваться только тогда, когда они параметризованы одним и тем же модулем,
case class Residue[M <: Int](n: Int) extends AnyVal {
def +(rhs: Residue[M])(implicit m: ValueOf[M]): Residue[M] =
Residue((this.n + rhs.n) % valueOf[M])
}
val fiveModTen = Residue[10](5)
val nineModTen = Residue[10](9)
fiveModTen + nineModTen // OK == Residue[10](4)
val fourModEleven = Residue[11](4)
fiveModTen + fourModEleven // compiler error: type mismatch;
// found : Residue[11]
// required: Residue[10]
Обратите внимание, что здесь модуль закодирован в типе значений, поэтому не требует дополнительных затрат на хранение для каждого значения. Когда в реализации + требуется значение времени выполнения модуля, оно предоставляется в месте вызова с помощью неявного аргумента m типа ValueOf[M].
- Annotations
- @implicitNotFound("Нет доступного одиночного значения для ${T}.")
type Vector[+A] = scala.collection.immutable.Vector[A]
class deprecated extends Annotation with StaticAnnotation
Аннотация, которая указывает, что определение устарело. При использовании аннотированного определения выводится предупреждение об устаревании.
Авторы библиотек должны указать политику устаревания своей библиотеки в документации, чтобы дать разработчикам руководство по тому, как долго будет сохраняться устаревшее определение.
Авторы библиотек должны преобразовывать имя своей библиотеки с номером версии, чтобы помочь разработчикам различать устаревшие определения, поступающие из разных библиотек:
@deprecated("this method will be removed", "FooLib 12.0")
def oldMethod(x: Int) = ...
Компилятор будет выводить предупреждения об устаревании, сгруппированные по библиотеке и версии:
oldMethod(1) oldMethod(2) aDeprecatedMethodFromLibraryBar(3, 4) // warning: there was one deprecation warning (since BarLib 3.2) // warning: there were two deprecation warnings (since FooLib 12.0) // warning: there were three deprecation warnings in total; re-run with -deprecation for details
@deprecated в языке Scala и его стандартной библиотеке
Устаревшее элемент языка Scala или определение в стандартной библиотеке Scala будет сохраняться по крайней мере на протяжении текущей основной версии.
Это означает, что элемент, устаревший в каком-то релизе 2.13.x, будет сохраняться во всех релизах 2.13.x, но может быть удален в 2.14. (Устаревший элемент может сохраняться дольше для упрощения миграции, но разработчики не должны полагаться на это.)
- Annotations
- @getter() @setter() @beanGetter() @beanSetter() @deprecatedInheritance("Планируется сделать final в 2.14", "2.13.0")
- Since
2.3
- См. также
-
Официальная документация по совместимости двоичных файлов.
final class deprecatedInheritance extends Annotation with StaticAnnotation
Аннотация, которая указывает, что наследование от класса устарело.
Это обычно делается для предупреждения о том, что нефинальный класс будет сделать финальным в будущей версии. Наследование от такого класса генерирует предупреждение.
Предупреждения не генерируются, если подкласс находится в одном файле компиляции.
Авторы библиотек должны указать политику устаревания своей библиотеки в документации, чтобы дать разработчикам руководство по тому, когда тип, помеченный аннотацией @deprecatedInheritance, будет final.
Авторы библиотек должны преобразовывать имя своей библиотеки с номером версии, чтобы помочь разработчикам различать устаревшие определения, поступающие из разных библиотек:
@deprecatedInheritance("this class will be made final", "FooLib 12.0")
class Foo
val foo = new Foo // no deprecation warning class Bar extends Foo // warning: inheritance from class Foo is deprecated (since FooLib 12.0): this class will be made final // class Bar extends Foo // ^
- Annotations
- @getter() @setter() @beanGetter() @beanSetter()
- Since
2.10
- См. также
class deprecatedName extends Annotation with StaticAnnotation
Аннотация, обозначающая, что имя параметра устарело.
Использование этого имени в именованном аргументе генерирует предупреждение об устаревании.
Авторы библиотек должны указывать политику устаревания библиотеки в своей документации, чтобы дать разработчикам рекомендации о том, как долго будет сохраняться устаревшее имя.
Авторы библиотек должны добавлять имя своей библиотеки к номеру версии, чтобы помочь разработчикам отличать устаревания, поступающие из разных библиотек:
def inc(x: Int, @deprecatedName("y", "FooLib 12.0") n: Int): Int = x + n
inc(1, y = 2)
выдаст следующее предупреждение:
warning: the parameter name y is deprecated (since FooLib 12.0): use n instead
inc(1, y = 2)
^
- Annotations
- @param() @deprecatedInheritance("Scheduled for being final in 2.14", "2.13.0")
- Since
2.8.1
- See also
class deprecatedOverriding extends Annotation with StaticAnnotation
Аннотация, обозначающая, что переопределение члена устарело.
Переопределение такого члена в подклассе затем генерирует предупреждение.
Авторы библиотек должны указывать политику устаревания библиотеки в своей документации, чтобы дать разработчикам рекомендации о том, когда метод, помеченный @deprecatedOverriding, будет final.
Авторы библиотек должны добавлять имя своей библиотеки к номеру версии, чтобы помочь разработчикам отличать устаревания, поступающие из разных библиотек:
class Foo {
@deprecatedOverriding("this method will be made final", "FooLib 12.0")
def add(x: Int, y: Int) = x + y
}
class Bar extends Foo // no deprecation warning
class Baz extends Foo {
override def add(x: Int, y: Int) = x - y
}
// warning: overriding method add in class Foo is deprecated (since FooLib 12.0): this method will be made final
// override def add(x: Int, y: Int) = x - y
// ^
- Annotations
- @getter() @setter() @beanGetter() @beanSetter() @deprecatedInheritance("Scheduled for being final in 2.14", "2.13.0")
- Since
2.10
- See also
class inline extends Annotation with StaticAnnotation
Аннотация для методов, которые оптимизатор должен встраивать.
Обратите внимание, что по умолчанию оптимизатор Scala отключен и никакие вызовы не встраиваются. См. -opt:help для информации о том, как включить оптимизатор и встраиватель.
Когда встраивание включено, встраиватель всегда будет пытаться встраивать методы или вызовы, помеченные @inline (при условии, что встраивание из определяющего класса разрешено, см. -opt-inline-from:help). Если встраивание невозможно, например, потому что метод не является окончательным, будет выдано предупреждение оптимизатора. См. -opt-warnings:help для подробностей.
Примеры:
@inline final def f1(x: Int) = x
@noinline final def f2(x: Int) = x
final def f3(x: Int) = x
def t1 = f1(1) // inlined if possible
def t2 = f2(1) // not inlined
def t3 = f3(1) // may be inlined (the inliner heuristics can select the callsite)
def t4 = f1(1): @noinline // not inlined (override at callsite)
def t5 = f2(1): @inline // inlined if possible (override at callsite)
def t6 = f3(1): @inline // inlined if possible
def t7 = f3(1): @noinline // not inlined
}
Примечание: скобки необходимы при аннотировании вызова в более сложном выражении.
def t1 = f1(1) + f1(1): @noinline // equivalent to (f1(1) + f1(1)): @noinline def t2 = f1(1) + (f1(1): @noinline) // the second call to f1 is not inlined
- Annotations
- @deprecatedInheritance("Scheduled for being final in 2.14", "2.13.0")
class native extends Annotation with StaticAnnotation
Маркер для нативных методов.
@native def f(x: Int, y: List[Long]): String = ...
Метод @native компилируется в нативный метод платформы, при этом отбрасывается тело метода (если оно есть). Тело будет проверено на соответствие типу, если оно присутствует.
Метод, помеченный @native, должен быть членом класса, а не трейта (начиная с 2.12).
- Annotations
- @deprecatedInheritance("Scheduled for being final in 2.14", "2.13.0")
- Since
2.6
final class noinline extends Annotation with StaticAnnotation
Аннотация для методов, которые оптимизатор не должен встраивать.
Обратите внимание, что по умолчанию оптимизатор Scala отключен и никакие вызовы не встраиваются. См. -opt:help для информации о том, как включить оптимизатор и встраиватель.
Когда встраивание включено, встраиватель никогда не будет встраивать методы или вызовы, помеченные @noinline.
Примеры:
@inline final def f1(x: Int) = x
@noinline final def f2(x: Int) = x
final def f3(x: Int) = x
def t1 = f1(1) // inlined if possible
def t2 = f2(1) // not inlined
def t3 = f3(1) // may be inlined (the inliner heuristics can select the callsite)
def t4 = f1(1): @noinline // not inlined (override at callsite)
def t5 = f2(1): @inline // inlined if possible (override at callsite)
def t6 = f3(1): @inline // inlined if possible
def t7 = f3(1): @noinline // not inlined
}
Примечание: скобки необходимы при аннотировании вызова в более сложном выражении.
def t1 = f1(1) + f1(1): @noinline // equivalent to (f1(1) + f1(1)): @noinline def t2 = f1(1) + (f1(1): @noinline) // the second call to f1 is not inlined
final class specialized extends Annotation with StaticAnnotation
Аннотировать параметры типа, на которых код должен быть автоматически специализирован. Например:
class MyList[@specialized T] ...
Тип T может быть специализирован на подмножестве примитивных типов, указав список примитивных типов для специализации:
class MyList[@specialized(Int, Double, Boolean) T] ..
- Since
2.8
final class throws[T <: Throwable] extends Annotation with StaticAnnotation
Аннотация для указания исключений, выбрасываемых методом. Например:
class Reader(fname: String) {
private val in = new BufferedReader(new FileReader(fname))
@throws[IOException]("if the file doesn't exist")
def read() = in.read()
}
- Since
2.1
final класс transient extends Annotation with StaticAnnotation
- Аннотации
- @field()
final класс unchecked extends Annotation
Аннотация, обозначающая, что анотированный элемент не должен рассматриваться для дополнительных проверок компилятором. Конкретные применения включают аннотирование объекта выражения сопоставления для подавления предупреждений об исчерпываемости и аннотирование аргумента типа в случае сопоставления для подавления предупреждений об unchecked ошибках.
Такое подавление следует использовать с осторожностью, без него могут возникнуть scala.MatchError или java.lang.ClassCastException во время выполнения. В большинстве случаев можно и следует устранить предупреждение вместо его подавления.
object Test extends App {
// This would normally warn "match is not exhaustive"
// because `None` is not covered.
def f(x: Option[String]) = (x: @unchecked) match { case Some(y) => y }
// This would normally warn "type pattern is unchecked"
// but here will blindly cast the head element to String.
def g(xs: Any) = xs match { case x: List[String @unchecked] => x.head }
}
- С момента
2.4
final класс volatile extends Annotation with StaticAnnotation
- Аннотации
- @field()
Члены-значения
val +:: scala.collection.+:.type
val :+: scala.collection.:+.type
val ::: scala.collection.immutable.::.type
val AnyRef: Specializable
val BigDecimal: scala.math.BigDecimal.type
val BigInt: scala.math.BigInt.type
val Either: scala.util.Either.type
val Equiv: scala.math.Equiv.type
val Fractional: scala.math.Fractional.type
val IndexedSeq: scala.collection.immutable.IndexedSeq.type
val Integral: scala.math.Integral.type
val Iterable: scala.collection.Iterable.type
val Iterator: scala.collection.Iterator.type
val LazyList: scala.collection.immutable.LazyList.type
val Left: scala.util.Left.type
val List: scala.collection.immutable.List.type
val Nil: scala.collection.immutable.Nil.type
val Numeric: scala.math.Numeric.type
val Ordered: scala.math.Ordered.type
val Ordering: scala.math.Ordering.type
val Range: scala.collection.immutable.Range.type
val Right: scala.util.Right.type
val Seq: scala.collection.immutable.Seq.type
val StringBuilder: scala.collection.mutable.StringBuilder.type
val Vector: scala.collection.immutable.Vector.type
object #::
object <:< extends java.io.Serializable
object Array extends java.io.Serializable
Утилитарные методы для работы с массивами. Например:
val a = Array(1, 2) val b = Array.ofDim[Int](2) val c = Array.concat(a, b)
где объекты массивов a, b и c соответственно имеют значения Array(1, 2), Array(0, 0) и Array(1, 2, 0, 0).
- Since
1.0
object Boolean extends AnyValCompanion
object Byte extends AnyValCompanion
object Char extends AnyValCompanion
object Console extends AnsiColor
Реализует функциональность для вывода значений Scala в терминал. Для чтения значений используйте StdIn. Также определяет константы для форматирования текста в терминалах ANSI.
Вывод в консоль
Используйте методы print для вывода текста.
scala> Console.printf( "Today the outside temperature is a balmy %.1f°C. %<.1f°C beats the previous record of %.1f°C.\n", -137.0, -135.05) Today the outside temperature is a balmy -137.0°C. -137.0°C beats the previous record of -135.1°C.
Коды ANSI
Используйте коды ANSI для изменения цвета вывода в консоль на STDOUT или STDERR.
import Console.{GREEN, RED, RESET, YELLOW_B, UNDERLINED}
object PrimeTest {
def isPrime(): Unit = {
val candidate = io.StdIn.readInt().ensuring(_ > 1)
val prime = (2 to candidate - 1).forall(candidate % _ != 0)
if (prime)
Console.println(s"${RESET}${GREEN}yes${RESET}")
else
Console.err.println(s"${RESET}${YELLOW_B}${RED}${UNDERLINED}NO!${RESET}")
}
def main(args: Array[String]): Unit = isPrime()
}
| $ scala PrimeTest |
| 1234567891 |
| да |
| $ scala PrimeTest |
| 56474 |
| НЕТ! |
Переопределение ввода-вывода
Используйте переопределение ввода-вывода для временной замены потоков ввода и/или вывода. В этом примере метод, основанный на потоке, обернут в функцию.
import java.io.{ByteArrayOutputStream, StringReader}
object FunctionalPrimeTest {
def isPrime(candidate: Int): Boolean = {
val input = new StringReader(s"$candidate\n")
val outCapture = new ByteArrayOutputStream
val errCapture = new ByteArrayOutputStream
Console.withIn(input) {
Console.withOut(outCapture) {
Console.withErr(errCapture) {
PrimeTest.isPrime()
}
}
}
if (outCapture.toByteArray.nonEmpty) // "yes"
true
else if (errCapture.toByteArray.nonEmpty) // "NO!"
false
else throw new IllegalArgumentException(candidate.toString)
}
def main(args: Array[String]): Unit = {
val primes = (2 to 50) filter (isPrime)
println(s"First primes: $primes")
}
}
| $ scala FunctionalPrimeTest |
| Первые простые числа: Vector(2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47) |
- Since
1.0
объект Double extends AnyValCompanion
объект DummyImplicit
объект Float extends AnyValCompanion
объект Function
Модуль, определяющий служебные методы для функционального программирования высшего порядка.
- Since
1.0
объект Function1
объект Int extends AnyValCompanion
объект Long extends AnyValCompanion
объект None extends Option[Nothing] with Product with Serializable
Этот объект case представляет несуществующие значения.
- Annotations
- @SerialVersionUID()
- Since
1.0
объект Option extends java.io.Serializable
объект PartialFunction
Несколько полезных операций, которые используют дополнительную информацию, доступную в частичных функциях. Примеры:
import PartialFunction._
def strangeConditional(other: Any): Boolean = cond(other) {
case x: String if x == "abc" || x == "def" => true
case x: Int => true
}
def onlyInt(v: Any): Option[Int] = condOpt(v) { case x: Int => x }
- Since
2.8
объект Predef extends LowPriorityImplicits
Объект Predef предоставляет определения, доступные во всех единицах компиляции Scala без явного квалификатора.
Типы, обычно используемые
Predef предоставляет псевдонимы типов для типов, которые обычно используются, такие как неизменяемые типы коллекций scala.collection.immutable.Map, scala.collection.immutable.Set и конструкторы scala.collection.immutable.List (scala.collection.immutable.:: и scala.collection.immutable.Nil).
Вывод в консоль
Для базового вывода в консоль, Predef предоставляет удобные методы print и println, которые являются псевдонимами методов в объекте scala.Console.
Утверждения
Набор assert функций предоставляется для использования в качестве способа документирования и динамической проверки инвариантов в коде. Вызовы assert могут быть исключены во время компиляции путем предоставления параметра командной строки -Xdisable-assertions, который поднимает -Xelide-below выше elidable.ASSERTION, до scalac команды.
Также предоставляются варианты assert для использования с инструментами статического анализа: assume, require и ensuring. require и ensuring предназначены для использования в качестве способа спецификации стиля контрактов проектирования предусловий и постусловий функций с намерением, что эти спецификации могут быть использованы инструментом статического анализа. Например,
def addNaturals(nats: List[Int]): Int = {
require(nats forall (_ >= 0), "List contains negative numbers")
nats.foldLeft(0)(_ + _)
} ensuring(_ >= 0)
Объявление addNaturals указывает, что переданный список целых чисел должен содержать только натуральные числа (т.е. неотрицательные), а возвращаемый результат также будет натуральным. require отличается от assert тем, что если условие не выполняется, то виноват вызывающий функцию, а не логическая ошибка, допущенная в самом addNaturals. ensuring — это форма assert, которая объявляет гарантию, предоставляемую функцией относительно ее возвращаемого значения.
Неявные преобразования
Здесь и в родительском типе scala.LowPriorityImplicits определено несколько часто используемых неявных преобразований. Неявные преобразования предоставляются для "расширения" числовых значений, например, для преобразования значения Short в Long при необходимости, а также для добавления дополнительных функций высшего порядка к массивам. Более подробное описание приведено в документации к scala.Array.
объект Product1
объект Product10
объект Product11
объект Product12
объект Product13
объект Product14
объект Product15
объект Product16
объект Product17
объект Product18
объект Product19
объект Product2
объект Product20
объект Product21
объект Product22
объект Product3
объект Product4
объект Product5
объект Product6
объект Product7
объект Product8
объект Product9
объект Short расширяет AnyValCompanion
объект Specializable
объект StringContext расширяет java.io.Serializable
объект Symbol расширяет UniquenessCache[String, Symbol] с java.io.Serializable
объект Unit расширяет AnyValCompanion
- Аннотации
- @compileTimeOnly("`Unit` companion object is not allowed in source; instead, use `()` for the unit value")
объект language
Объект scala.language управляет доступными программисту языковыми возможностями, как предложено в документе SIP-18.
Каждая из этих возможностей должна быть явно импортирована в текущий контекст, чтобы стать доступной:
import language.postfixOps // or language._ List(1, 2, 3) reverse
Доступные языковые возможности:
dynamics позволяет определять переписывание вызовов с использованием Dynamic
existentials позволяет писать экзистенциальные типы
higherKinds позволяет писать типы высшего порядка
implicitConversions позволяет определять неявные методы и члены
postfixOps позволяет использовать постфиксные операторы (не рекомендуется)
reflectiveCalls позволяет использовать структурные типы
experimental содержит более новые возможности, которые еще не были протестированы в производстве объект languageFeature
© 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/index.html
Основные типы Scala. Они всегда доступны без явного импорта.