2014-12-23 11 views
14

Was ist der Unterschied zwischen Some und Option?Scala Einige v. Option

scala> Some(true) 
res2: Some[Boolean] = Some(true) 

scala> val x: Option[Boolean] = Some(true) 
x: Option[Boolean] = Some(true) 

scala> res2 == x 
res3: Boolean = true 

Ich sehe, dass Option(null) zurückkehrt, während Some(null) nicht kompiliert:

scala> val x = Option(null) 
x: Option[Null] = None 

scala> val x: Option[Boolean] = Some(null) 
<console>:7: error: an expression of type Null is ineligible for implicit conversion 
     val x: Option[Boolean] = Some(null) 
            ^
+1

möglich Duplikat [Differenz zwischen Option (Wert) und einige (Wert)] (http://stackoverflow.com/questions/22908662/difference-between-optionvalue-and- somevalue) – Noah

+0

Nicht ein Betrogener. Aber im Zusammenhang mit http://stackoverflow.com/q/27611133/1296806 Vielleicht ist ein schmaler Titel erforderlich. –

Antwort

11

Nun, Some erstreckt Option, so dass es alles außer get und isEmpty erbt (und einige andere Methoden, die von einem Fall implementiert Klasse).

Das Begleitobjekt der Option hat eine spezielle apply Methode für den Umgang mit null:

def apply[A](x: A): Option[A] = if (x == null) None else Some(x) 

Aber Some.apply ist nur die Standard-apply Verfahren für einen Fall, Klasse erzeugt.

Some(null) wird unter Umständen kompilieren, aber es hat Some[Null] (oder Option[Null]) Typ, der nur zugewiesen werden können, wenn der Typ des Arguments Option ein Referenztyp ist.

scala> val a = Some(null) 
a: Some[Null] = Some(null) 

scala> val b: Option[String] = Some(null) 
b: Option[String] = Some(null) 

Sie versuchen, ein Some[Null] zu einem Option[Boolean] zuweisen, sondern ein Null ist kein Untertyp Boolean, weil Boolean ein Werttyp (primitiver unten) ist und einen Wert von null nicht halten kann.

+1

Die gestrige Frage über den Schnittpunkt von Boxed-Primitiven und null: http://Stackoverflow.com/q/27611133/1296806 Sie könnten uns sagen, warum 'null.asInstanceOf [Int]' ist Null (durch die Spezifikation), aber der erwartete Boxed-Typ dreht sich es in null anstatt in boxed zero. Alternativ ist 'Some (null) map (runtime.BoxesRunTime.unboxToInt) 'gleich Null. –

13

Aus der Perspektive der funktionalen Programmierung ist der Typ Option [T] bei einem beliebigen Typ T ein algebraischer Datentyp mit den Datenkonstruktoren None und Some (x: T).
Dies ist nur eine codierte Art zu sagen, dass, wenn der Typ T besteht aus den Werten t1, t2, t3, ... dann alle die Werte des Typs Option [T] sind keine, einige (t1), Einige (t2), einige (t3), ...

Fast alles andere folgt daraus. Wenn beispielsweise Null kein Wert von T ist, dann ist Some (null) kein Wert von Option [T]. Dies erklärt, warum

val x: Option[Boolean] = Some(null) 

nicht funktioniert, während

val x: Option[Null] = Some(null) 

tut.

Schließlich, speziell zu Scala, scheint es eine zusätzliche Eigenart darin zu geben, "aus Bequemlichkeit" kann man Option (null) sagen, wenn sie Keine bedeuten. Ich würde erwarten, dass man auch Option (t) sagen kann, wenn sie Some (t) bedeuten.

10

Kurz

  Option 
      / \ 
     / \ 
     /  \ 
     Some  None 

Option ist, die Behälterbasis

leer oder voll sein kann, während einige (x) voll repräsentieren mit 'x' in dem Behälter vorhanden ist, stellt keine leer.

1

Die Grundidee der Option ist, um einen Standardwert haben und vermeiden eine Nullpointer mit Null zu beseitigen. Die Option kann also einen Wert oder keine haben (ersetzt Null). Sehen Sie sich diese große Erklärung der Option aus: Scala Option explained

Verwandte Themen