Используя Любого для обработки отказов в коде Scala

Есть еще один способ, если ваш массив имеет тип char []:

char A[] = {'a', 'b', 'c'}; 

System.out.println(A); // no other arguments

print

abc
50
задан Alexander Azarov 27 July 2009 в 23:53
поделиться

2 ответа

Либо используется для возврата одного из двух возможных значимых результатов, в отличие от Option, которое используется для возврата одного значимого результата или ничего.

Простой для понимания пример приведен ниже (распространен на список рассылки Scala некоторое время назад):

def throwableToLeft[T](block: => T): Either[java.lang.Throwable, T] =
  try {
    Right(block)
  } catch {
    case ex => Left(ex)
  }

Как следует из названия функции, если выполнение «блока» прошло успешно, она вернет «Право (<результат>)». В противном случае, если брошен Throwable, он вернет «Left ()». Используйте сопоставление с образцом для обработки результата:

var s = "hello"
throwableToLeft { s.toUpperCase } match {
  case Right(s) => println(s)
  case Left(e) => e.printStackTrace
}
// prints "HELLO"

s = null
throwableToLeft { s.toUpperCase } match {
  case Right(s) => println(s)
  case Left(e) => e.printStackTrace
}
// prints NullPointerException stack trace

Надеюсь, что это поможет.

50
ответ дан 7 November 2019 в 11:03
поделиться

Приведенный вами фрагмент кажется очень надуманным. Вы используете Either в ситуации, когда:

  1. Недостаточно просто знать, что данные недоступны.
  2. Вам нужно вернуть один из двух различных типов.

Преобразование исключения в Left действительно, распространенный вариант использования. По сравнению с try / catch он имеет преимущество в том, что код хранится вместе, что имеет смысл, если исключение составляет ожидаемый результат . Наиболее распространенный способ обработки Either - это сопоставление с образцом:

result match {
  case Right(res) => ...
  case Left(res) => ...
}

Другой интересный способ обработки Either - когда он появляется в коллекции. При создании карты для коллекции генерация исключения может оказаться нежизнеспособной, и вы можете захотеть вернуть некоторую информацию, кроме «невозможно». Использование Either позволяет сделать это, не перегружая алгоритм:

val list = (
  library 
  \\ "books" 
  map (book => 
    if (book \ "author" isEmpty) 
      Left(book) 
    else 
      Right((book \ "author" toList) map (_ text))
  )
)

Здесь мы получаем список всех авторов в библиотеке, плюс список книг без автора. Итак, мы можем затем обработать его соответствующим образом:

val authorCount = (
  (Map[String,Int]() /: (list filter (_ isRight) map (_.right.get))) 
   ((map, author) => map + (author -> (map.getOrElse(author, 0) + 1)))
  toList
)
val problemBooks = list flatMap (_.left.toSeq) // thanks to Azarov for this variation

Итак, базовое использование Either выглядит следующим образом. Это не особенно полезный класс, но если бы он был, вы бы видели его раньше. С другой стороны, это тоже не бесполезно.

7
ответ дан 7 November 2019 в 11:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: