Получить значение параметра или создать исключение
учитывая вариант, каков идиоматический способ получить его значение или бросить попытку исключения?
def foo() : String = {
val x : Option[String] = ...
x.getOrException()
}
5 ответов:
(EDIT: это не самый лучший или самый идиоматический способ сделать это. Я написал его, когда не был знаком со Скала. Я оставляю его здесь для примера, как не сделать это. В настоящее время я бы сделал как @TravisBrown)
Я думаю, что это действительно сводится к двум вещам:
- как обязательно вы что, ценность есть?
- как хочешь реагировать если это не так?
если в этой точке ваш код ожидал значение, чтобы быть там, и в случае, что это не вы хотите, чтобы ваша программа fail быстро, тогда я бы сделал только нормальный
getи пусть Скала кинутьNoSuchElementExceptionесли не было никакого значения:def foo() : String = { val x : Option[String] = ... x.get }если вы хотите вести дела по-другому (бросить свое собственное исключение) я думаю, что более изящно будет выглядеть так:
def foo(): String = { val x: Option[String] = None x match { case Some(value) => value case None => throw new MyRuntimeException("blah") } }и конечно, если вы хотите поставить свой собственный альтернативное значение для дела что за
OptionиNoneвы бы просто использоватьgetOrElse:def foo(): String = { val x: Option[String] = None x.getOrElse("my alternative value") }
A
throw"оператор" - это действительно выражение в Scala, и оно имеет типNothing, который является подтипом любого другого типа. Это означает, что вы можете просто использовать обычный старыйgetOrElse:def myGet[A](oa: Option[A]) = oa.getOrElse(throw new RuntimeException("Can't."))вы действительно, действительно не должны делать этого, хотя.
просто использовать .метод get.
def get[T](o:Option[T]) = o.getон вызовет исключение NoSuchElementException, если o является экземпляром None.
в принципе, я бы работал с такими вариантами:
def addPrint(oi:Option[Int]) = oi.map(_+1).foreach(println) addPrint(Some(41)) addPrint(Some(1336)) addPrint(None)чтобы избежать вашего конкретного вопроса.
Я думаю, что это поможет вам остаться на "функциональную" сторону :)
TL; DR
- бросить
Exceptionсигнализировать о неожиданном сбое в чисто функциональном коде.- использовать
Optionдля возврата дополнительных значений.- использовать
Option(possiblyNull)чтобы избежать случаевSome(null).- использовать
Eitherсообщить об ожидаемом сбое.- использовать
Try, а неEitherвернуться исключения.- использовать
Tryа не блок catch для обработки непредвиденная ошибка.- использовать
Tryпри работе сFuture.- разоблачение
Tryв общедоступном API имеет аналогичный эффект в качестве проверенного исключения. Вместо этого рассмотрите возможность использования исключений.
Scala теперь поддерживает эту операцию на картах с помощью
getOrElse()метод, см. документацииКак уже отмечалось, выбрасывание исключения в Scala также является выражением.
таким образом, вы можете сделать следующее:
myMap.getOrElse(myKey, throw new MyCustomException("Custom Message HERE")