これは非常に古いトピックですが、素晴らしいトピックです。
Try to Optionの例外以外の結果を変換すると、いくつかの結果が得られるのは事実です...
scala> Try(null).toOption
res10: Option[Null] = Some(null)
... Tryはnull可能性チェックではなく、機能的に例外を処理する方法であるためです。
Try to catch例外を使用し、それを便宜上Optionに変換すると、例外が発生した場合にのみNoneが表示されます。
scala> Try(1/0).toOption
res11: Option[Int] = None
Tryから得られる値を保持する必要があります。それはnullかもしれません。
しかし、標準のライブラリが時々非常に混乱していることも事実です...
scala> Try(null).toOption
res12: Option[Null] = Some(null)
scala> Option(null)
res13: Option[Null] = None
この動作は少し一貫性がありませんが、TryとOptionの両方の意図された使用法を反映しています。
tryを使用して、例外をスローする可能性のある式から出てくるものをすべて取得します。例外自体は気にしません。
出てくる可能性のある値は、nullである可能性があります。toOptionでNoneが指定された場合、例外とnullを区別できません。これは、見栄えがよくありません。
スタンドアロンでは、Optionを使用して、何かの存在の有無をカプセル化します。したがって、その場合、Some(null)はNoneであり、それは理にかなっています。その場合のnullは、何かが存在しないことを表すからです。ここにあいまいさはありません。
.toOptionはOption()と同じではないため、どのような場合でも参照透過性が損なわれないことに注意することが重要です。
例外安全性とnull安全性の両方を実際に適用する必要があり、コードが実際にnullと例外を区別する必要がない場合は、両方のパラダイムを組み合わせるだけです。ええと、それはあなたが望むものですよね?
あなたは1つの方法でそれを行うことができます...
scala> Try(Option(null)).getOrElse(None)
res23: Option[Null] = None
scala> Try(Option(3/0)).getOrElse(None)
res24: Option[Int] = None
scala> Try(Option(3)).getOrElse(None)
res25: Option[Int] = Some(3)
...または別の..。
scala> Try(Option(null)).toOption.flatten
res26: Option[Null] = None
scala> Try(Option(3/0)).toOption.flatten
res27: Option[Int] = None
scala> Try(Option(3)).toOption.flatten
res28: Option[Int] = Some(3)
...またはそれらのばかばかしいほど醜い他のもの..。
scala> Option(Try(null).getOrElse(null))
res29: Option[Null] = None
scala> Option(Try(3/0).getOrElse(null))
res30: Option[Any] = None
scala> Option(Try(3).getOrElse(null))
res31: Option[Any] = Some(3)