13

Scala では、何かを に設定したい場合None、いくつかの選択肢があります:Noneまたはを使用しOption.empty[A]ます。

どちらかを選択して一貫して使用する必要がありますか? それとも、どちらか一方を使用する必要がある場合がありますか?

例:

scala> def f(str: Option[String]) = str
f: (str: Option[String])Option[String]

scala> f(None)
res0: Option[String] = None

scala> f(Option.empty)
res1: Option[String] = None
4

5 に答える 5

5

たとえば、パラメーターを関数に渡すNoneときなど、値について話している場合は、Option.empty[T]何かを定義するときに使用します。

var something = Option.empty[String]手段somethingNone今のところですがSome("hede")、将来になる可能性があります。一方、var something = None何も意味しません。あなたはSome("hede")コンパイラ でそれを再割り当てする found : Some[String] required: None.type ことはできません. どの Option[T] にも渡すことができますが、 Some[T] を None.type に渡すことはできませんNoneOption.empty[T]None

于 2016-03-28T07:54:14.337 に答える
1

以下は、Scala と Scalaz を使用したワークシートのエクスポートです。

def f(str: Option[String]) = str              //> f: (str: Option[String])Option[String]
f(None)                                       //> res1: Option[String] = None
var x:Option[String]=None                     //> x  : Option[String] = None
x=Some("test")
x                                             //> res2: Option[String] = Some(test)
x=None
x      

今 Scalaz を使って、

def fz(str: Option[String]) = str             //> fz: (str: Option[String])Option[String]
fz(none)                                      //> res4: Option[String] = None
var xz:Option[String]=none                    //> xz  : Option[String] = None
xz=some("test")
xz                                            //> res5: Option[String] = Some(test)
xz=none
xz         

Noneorの使用に関係なく、すべてのステートメントが同じように評価されることに注意してくださいOption.Empty。どのように ?

var x:Option[String]=Noneご覧のとおり、ステートメントの戻り値の型を介して Scala に意図を知らせることが重要です。これにより、後で a を割り当てることができますSome。ただし、変数 x が に解決され、 に解決されないvar x=Noneため、後の行ではシンプルに失敗します。None.typeOption[T]

慣習に従うべきだと思います。課題については、var x:Option[String]=Noneオプションを選択します。また、 None を使用するときはいつでも、割り当てが に解決されないように、戻り値の型 (この場合は Option[String]) を使用することをお勧めしNone.typeます。
タイプを提供する方法がなく、いくつかの割り当てを行う必要がある場合にのみ、私は行きますOption.empty

于 2016-03-28T06:33:33.167 に答える
1

Option[A].empty単に返すと仮定するとNone

/** An Option factory which returns `None` in a manner consistent with
 *  the collections hierarchy.
 */
def empty[A] : Option[A] = None

私は言います:

  1. あなたが言ったように、コードベース全体で一貫性を保ってください。一貫性を保つことは、コードベースに入るプログラマーが心配することが 1 つ少なくなることを意味します。「またはを使用する必要がありますNoneOption.empty?まあ、@cdmckay はコールベース全体で X を使用しているようです。私もそれを使用します」
  2. 読みやすさ - 最も必要なポイントを伝えるものを考えてください。特定のメソッドを読む場合、それが空を返した場合Option(基になる実装が単純に を返しているという事実をしばらく無視しましょうNone) または明示的に返された場合、より意味がありますNoneか? IMO、 Noneドキュメントに指定されているように、存在しない値と考えています。

    /** This case object represents non-existent values.
     *
     *  @author  Martin Odersky
     *  @version 1.0, 16/07/2003
     */
    
于 2016-03-28T06:51:16.017 に答える
0

他の誰もが指摘したように、それは個人的な好みの問題であり、ほとんどの人が好むNoneか、場合によっては、コンパイラが推論できないため、型を明示的に配置する必要があります。

Sequencesこの問題は、MapSet、などの他の Scala クラスに当てはめることができますList。それらのすべてで、空の状態を定義する方法がいくつかあります。シーケンスの使用:

  • Seq()
  • Seq.empty
  • Seq.empty[Type]

3 つのうち、私は 2 番目を好みます。理由は次のとおりです。

  • 最初の ( Seq()) はエラーが発生しやすいものです。誰かがシーケンスを作成したいのに、要素を追加するのを忘れたようです
  • 2 番目の ( Seq.empty) は、空のシーケンスが必要であることを明示しています。
  • 3 番目の ( Seq.empty[Type]) は 2 番目と同じくらい明示的ですが、より冗長なので、通常は使用しません。
于 2016-03-28T19:13:55.093 に答える