2017-03-19 8 views
-1

これは私にとって非常に奇妙なようです:私はOption[someType]という変数を持っていて、someTypeオブジェクトを割り当てます。なぜオブジェクトを明示的にオプション?Scala - 型のOption [型]への暗黙的変換

var num: Option[Int] = Option[Int](3) // works 
var num: Option[Int] = 3    // seems reasonable, but doesn't compile 

編集:私はむしろ、「これを回避する方法」よりも、「なぜScalaはこのようにそれを実装しました」の詳細であることを私の質問を意味しました。ご覧のとおり、私はそれを回避する方法を知っています。

IntOption[Int]と考えることはできません。私はIntList[Int]ではない理由を知っています(私はパラダイムがそれであると想像することもできますが)。Option[Int]への変換をシームレスに行わないというロジックは見えません。

+0

「Some(3)」と言うのはもっと普通だと思います。私はあなたがキャストしているとは思わない。私はあなたが 'Option.apply(3)'( 'Some(3)'を返す)を呼び出すと信じています。 –

+1

はい、論理的な観点からは、 'A'型のすべての値も考えることができます'Option [A]' '型のオプションの値として扱いますが、実際には、これは非常に煩わしいことがあります。 – Yawar

+0

'AnyVal'の型はnullにできませんが、Scalaコンパイラが' AnyRef'型のインスタンスがnullでないことを静的に知る方法はありません。 – Ryan

答えて

0

Optionは、2つの異なる状態、

を持つことができますどちらかそれはNone次のとおりです。

val num: Option[Int] = None 

か、Some次のように定義されます

val num: Option[Int] = Some(99) 

あなたが変換するための暗黙の型変換を定義することができますOption[Int] to Intから、その逆の場合もありますが、所有していないタイプの暗黙的な変換は一般的にfうんざりする。

コードがコンパイルされない理由は、タイプIntを期待しているものに割り当てており、範囲に暗黙的な変換がないためです。

3

キャストする必要はありません。 3Option[Int]ではないため、タイプOption[Int]のオブジェクトを作成するだけで済みます。

Optionは他のすべてと同様のタイプです。インスタンスval l: List[Int] = 3も動作すると思いますか?

あなたが本当にそれはあなたが自動的に行わことができますしたい場合:および/または一般的なタイプへの

implicit def anyToOption[A](a: A): Option[A] = Option(a) 

しかし、暗黙的な変換は、通常、悪い習慣と考えられています。

関連する問題