78

オプションが与えられた場合、その値を取得したり例外をスローしたりする慣用的な方法は何ですか?

def foo() : String = {
  val x : Option[String] = ...
  x.getOrException()
}
4

5 に答える 5

136

throwステートメント」は実際には Scala の式でNothingあり、他のすべての型のサブタイプである type を持ちます。これは、単純な古いものをそのまま使用できることを意味しますgetOrElse:

def myGet[A](oa: Option[A]) = oa.getOrElse(throw new RuntimeException("Can't."))

しかし、あなたは本当に、本当にこれをすべきではありません。

于 2013-04-28T14:03:19.943 に答える
51

(編集: これは最善の、または最も慣用的な方法ではありません。Scala に慣れていないときに書いたものです。そうしない方法の例としてここに残します。現在は @TravisBrown として行います)

私はそれが本当に2つのことに要約されると思います:

  • 価値があることをどの程度確信していますか?
  • そうでない場合、どのように反応したいですか?

コードのその時点で値が存在することを期待していて、リモートのケースではプログラムがすぐに失敗することを望んでいない場合、私は通常の処理のみを行い、値がない場合はgetScala にスローさせます。 NoSuchElementException:

def foo() : 文字列 = {
  val x : オプション[文字列] = ...
  x.get
}

ケースを別の方法で処理したい場合 (独自の例外をスロー)、よりエレガントな方法は次のようになると思います。

def foo(): 文字列 = {
  val x: オプション[文字列] = なし
  ×マッチ{
    case Some(値) => 値
    case None => throw new MyRuntimeException("blah")
  }
}

そしてもちろん、 が使用される場合に独自の代替値を提供したい場合は、Option次のNoneようにしますgetOrElse

def foo(): 文字列 = {
  val x: オプション[文字列] = なし
  x.getOrElse("私の代替値")
}
于 2013-04-29T09:18:53.097 に答える
13

.get メソッドを使用するだけです。

def get[T](o:Option[T]) = o.get

o が None のインスタンスである場合、NoSuchElementException がスローされます。

基本的に、次のようなオプションを使用します。

def addPrint(oi:Option[Int]) = oi.map(_+1).foreach(println)
addPrint(Some(41))
addPrint(Some(1336))
addPrint(None)

あなたの特定の質問を避けるために。

于 2013-04-28T14:05:33.487 に答える