Spec-Zone.ru › Scala 3.2

Класс Right.Right

Исходный код

final case class Right[+A, +B](value: B) extends Either[A, B]

Правая сторона объединения по типу «либо-либо», в отличие от стороны scala.util.Left.

Надтипы
класс Either[A, B]
интерфейс Serializable
интерфейс Product
интерфейс Equals
класс Object
интерфейс Matchable
класс Any

Конкретные методы

Исходный код
def isLeft: Boolean

Возвращает true если это Left, false в противном случае.

Left("tulip").isLeft // true
Right("venus fly-trap").isLeft // false

Исходный код
def isRight: Boolean

Возвращает true если это Right, false в противном случае.

Left("tulip").isRight // false
Right("venus fly-trap").isRight // true

Исходный код
def withLeft[A1 >: A]: Either[A1, B]

Преобразует этот Right[A, B] к Either[A1, B]

Right("x")               // Either[Nothing, String]
Right("x").withLeft[Int] // Either[Int, String]

Наследованные методы

Исходный код
final def contains[B1 >: B](elem: B1): Boolean

Возвращает true если это Right и его значение равно elem (определяется ==), возвращает false в противном случае.

// Returns true because value of Right is "something" which equals "something".
Right("something") contains "something"

// Returns false because value of Right is "something" which does not equal "anything".
Right("something") contains "anything"

// Returns false because it's not a Right value.
Left("something") contains "something"
Параметры значения
elem

элемент для проверки.

Возвращает

true если это Right значение, равное elem.

Унаследовано от Either

Исходный код
def exists(p: B => Boolean): Boolean

Возвращает false если Left или возвращает результат применения данного предиката к Right значению.

Right(12).exists(_ > 10)   // true
Right(7).exists(_ > 10)    // false
Left(12).exists(_ => true) // false
Унаследовано от Either

Исходный код
def filterOrElse[A1 >: A](p: B => Boolean, zero: => A1): Either[A1, B]

Возвращает Right с существующим значением Right если это Right и данный предикат p выполняется для правого значения, или Left(zero) если это Right и данный предикат p не выполняется для правого значения, или Left с существующим значением Left если это Left.

Right(12).filterOrElse(_ > 10, -1)   // Right(12)
Right(7).filterOrElse(_ > 10, -1)    // Left(-1)
Left(7).filterOrElse(_ => false, -1) // Left(7)
Унаследовано от Either

Исходный код
def flatMap[A1 >: A, B1](f: B => Either[A1, B1]): Either[A1, B1]

Связывает данную функцию со значением Right.

Параметры значения
f

Функция для связывания со значением Right.

Унаследовано от Either

Исходный код
def flatten[A1 >: A, B1](implicit ev: B <:< Either[A1, B1]): Either[A1, B1]

Возвращает правое значение, если это право, или это значение, если это лево

Пример
val  l: Either[String, Either[String, Int]] = Left("pancake")
val rl: Either[String, Either[String, Int]] = Right(Left("flounder"))
val rr: Either[String, Either[String, Int]] = Right(Right(7))
l.flatten //Either[String, Int]: Left("pancake")
rl.flatten //Either[String, Int]: Left("flounder")
rr.flatten //Either[String, Int]: Right(7)

Эквивалентно flatMap(id => id)

Унаследовано от Either

Исходный код
def fold[C](fa: A => C, fb: B => C): C

Применяет fa если это Left или fb если это Right.

Параметры значения
fa

функция для применения, если это Left

fb

функция для применения, если это Right

Возвращает

результат применения функции

Пример
val result = util.Try("42".toInt).toEither
result.fold(
  e => s"Operation failed with $e",
  v => s"Operation produced value: $v"
)
Унаследовано от Either

Исходный код
def forall(f: B => Boolean): Boolean

Возвращает true если Left или возвращает результат применения данного предиката к Right значению.

Right(12).forall(_ > 10)    // true
Right(7).forall(_ > 10)     // false
Left(12).forall(_ => false) // true
Унаследовано от Either

Исходный код
def foreach[U](f: B => U): Unit

Выполняет данную функцию с побочным эффектом, если это Right.

Right(12).foreach(println) // prints "12"
Left(12).foreach(println)  // doesn't print
Параметры значения
f

Функция с побочным эффектом для выполнения.

Унаследовано от Either

Исходный код
def getOrElse[B1 >: B](or: => B1): B1

Возвращает значение из этого Right или заданный аргумент, если это Left.

Right(12).getOrElse(17) // 12
Left(12).getOrElse(17)  // 17
Унаследовано от Either

Исходный код
def joinLeft[A1 >: A, B1 >: B, C](implicit ev: A1 <:< Either[C, B1]): Either[C, B1]

Объединяет Either через Left.

Этот метод требует, чтобы левая сторона этого Either являлась типом Either. То есть, это должен быть какой-то тип, например:

Either[Either[C, B], B]

(что учитывает ограничения по типу, показанные ниже.)

Если этот экземпляр является Left[Either[C, B]] , то содержащееся Either[C, B] будет возвращено, в противном случае это значение будет возвращено без изменений.

Left[Either[Int, String], String](Right("flower")).joinLeft // Result: Right("flower")
Left[Either[Int, String], String](Left(12)).joinLeft // Result: Left(12)
Right[Either[Int, String], String]("daisy").joinLeft // Result: Right("daisy")

Этот метод и joinRight, аналогичны Option#flatten.

Унаследовано от Either

Исходный код
def joinRight[A1 >: A, B1 >: B, C](implicit ev: B1 <:< Either[A1, C]): Either[A1, C]

Объединяет Either через Right.

Этот метод требует, чтобы правая сторона этого Either являлась типом Either. То есть, это должен быть какой-то тип, например:

Either[A, Either[A, C]]

(что учитывает ограничения по типу, показанные ниже.)

Если этот экземпляр является Right[Either[A, C]] , то содержащееся Either[A, C] будет возвращено, в противном случае это значение будет возвращено без изменений.

Пример
Right[String, Either[String, Int]](Right(12)).joinRight // Result: Right(12)
Right[String, Either[String, Int]](Left("flower")).joinRight // Result: Left("flower")
Left[String, Either[String, Int]]("flower").joinRight // Result: Left("flower")

Этот метод, и joinLeft, аналогичны Option#flatten

Унаследовано от Either

Исходный код
def left: LeftProjection[A, B]

Проектирует это Either как Left.

Это позволяет использовать циклы «for» для работы с левой стороной Either экземпляров, обращая обычную правую предвзятость Either.

Например

for (s <- Left("flower").left) yield s.length // Left(6)

Продолжая аналогию с scala.Option, LeftProjection объявляет, что Left должно быть аналогом Some в некотором коде.

// using Option
def interactWithDB(x: Query): Option[Result] =
  try Some(getResultFromDatabase(x))
  catch {
    case _: SQLException => None
  }

// this will only be executed if interactWithDB returns a Some
val report = for (result <- interactWithDB(someQuery)) yield generateReport(result)
report match {
  case Some(r) => send(r)
  case None    => log("report not generated, not sure why...")
}

// using Either
def interactWithDB(x: Query): Either[Exception, Result] =
  try Right(getResultFromDatabase(x))
  catch {
    case e: SQLException => Left(e)
  }

 // run a report only if interactWithDB returns a Right
 val report = for (result <- interactWithDB(someQuery)) yield generateReport(result)
 report match {
   case Right(r) => send(r)
   case Left(e)  => log(s"report not generated, reason was $e")
 }
 // only report errors
 for (e <- interactWithDB(someQuery).left) log(s"query failed, reason was $e")
Унаследовано от Either

Исходный код
def map[B1](f: B => B1): Either[A, B1]

Указанная функция применяется, если это Right.

Right(12).map(x => "flower") // Result: Right("flower")
Left(12).map(x => "flower")  // Result: Left(12)
Унаследовано от Either

Исходный код
def orElse[A1 >: A, B1 >: B](or: => Either[A1, B1]): Either[A1, B1]

Возвращает этот Right или переданный аргумент, если это Left.

Right(1) orElse Left(2) // Right(1)
Left(1) orElse Left(2)  // Left(2)
Left(1) orElse Left(2) orElse Right(3) // Right(3)
Унаследовано от Either

Исходный код
def productElementNames: Iterator[String]

Итератор по именам всех элементов этого произведения.

Унаследовано от Product

Исходный код
def productIterator: Iterator[Any]

Итератор по всем элементам этого произведения.

Возвращает

в реализации по умолчанию, Iterator[Any]

Унаследовано от Product

Исходный код
def swap: Either[B, A]

Если это Left, то возвращает левое значение в Right, или наоборот.

Пример
val left: Either[String, Int]  = Left("left")
val right: Either[Int, String] = left.swap // Result: Right("left")
val right = Right(2)
val left  = Left(3)
for {
  r1 <- right
  r2 <- left.swap
} yield r1 * r2 // Right(6)
Унаследовано от Either

Исходный код
def toOption: Option[B]

Возвращает Some, содержащий значение Right, если оно существует, или None, если это Left.

Right(12).toOption // Some(12)
Left(12).toOption  // None
Унаследовано от Either

Исходный код
def toSeq: Seq[B]

Возвращает Seq содержащее значение Right, если оно существует, или пустое Seq, если это Left.

Right(12).toSeq // Seq(12)
Left(12).toSeq  // Seq()
Унаследовано от Either

Исходный код
def toTry(implicit ev: A <:< Throwable): Try[B]

Унаследовано от Either

© 2002-2022 EPFL, with contributions from Lightbend.
Licensed under the Apache License, Version 2.0.
https://scala-lang.org/api/3.2.0/scala/util/Right.html

Spec-Zone.ru

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