Nun ... das erste, was ich sagen werde ist, dass "Wenn in Scala-Land, bleiben Sie so weit wie möglich von einem Null-Monster". Die sind Gefährlich.
Nun ... wie dieses Verhalten zu verstehen, das erste, was Sie in Scala-Shell versuchen müssen, ist folgende,
scala> val n = null
n: Null = null
So ... In Scala null
ist eine Instanz dieser Klasse Null
.
Nun ... mal sehen, was passiert, wenn wir diese null
mit Option
mischen,
scala> val nullOpt1 = Option(null)
nullOpt1: Option[Null] = None
scala> val nullOpt2 = Some(null)
nullOpt2: Some[Null] = Some(null)
Beachten Sie den Unterschied ... zwischen den beiden ... Also im Grunde Scala Leute dachten, dass es Menschen geben kann, die Willst du eine null
in eine Option
... wickeln so erlaubte sie explicitly
Some.apply
zu verwenden, um diese null
in eine Option
zu wickeln. Wo sich die Verwendung von Option.apply
mehr "intelligent" verhalten und gibt Ihnen eine None
, wenn Sie versuchen, eine null
zu wickeln.
Nun ... lässt zunächst einen Blick auf, wie map
für eine Option
implementiert ist,
final def map[B](f: A => B): Option[B] =
if (isEmpty) None else Some(f(this.get))
Und jetzt ... sollte klar sein, wie zu „warum Some(null).map((x: String) => x)
Sie Some(null)
gibt?“.
Was die for
Fälle zu verstehen ... das wird ein wenig Verständnis erfordern, wie for
für Option
mit der Verwendung von Repr
‚s durchgeführt wird. Und das Verhalten wird klar werden.
http://stackoverflow.com/questions/4952124/why-is-there-difference-in-behavior-between-these-two-pattern-matches-in-a-for- –