Ну ... первое, что я скажу, это то, что «Когда в Скала-стране, по возможности, остановитесь от нуль-монстра». Они опасны.
Теперь ... чтобы понять это поведение, то первое, что вам нужно попробовать в Scala-оболочки, следуя
scala> val n = null
n: Null = null
Итак ... В Scala null
является экземпляром этого класса Null
,
Теперь ... давайте посмотрим, что происходит, когда мы смешиваем это null
с Option
,
scala> val nullOpt1 = Option(null)
nullOpt1: Option[Null] = None
scala> val nullOpt2 = Some(null)
nullOpt2: Some[Null] = Some(null)
Обратите внимание на разницу ... между ними ... Так что в основном Scala люди думали, что там могут быть люди, которые хотите обернуть null
в Option
... поэтому они разрешили им explicitly
использовать Some.apply
, чтобы обернуть это null
в Option
. Где, когда использование Option.apply
ведет себя «разумно» и дает вам None
, когда вы пытаетесь обернуть null
.
Теперь ... давайте сначала рассмотрим, как map
реализуется для Option
,
final def map[B](f: A => B): Option[B] =
if (isEmpty) None else Some(f(this.get))
А теперь ... это должно быть ясно, «почему Some(null).map((x: String) => x)
дает Some(null)
?».
Что касается понять for
дел ... что потребует немного понимания того, как for
реализуется для Option
с использованием Repr
-х гг. И поведение станет ясным.
http://stackoverflow.com/questions/4952124/why-is-there-a-difference-in-behavior-between-these-two-pattern-matches-in-a-for –