Scala Некоторые варианты v.
Какая разница между Some
и 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
Я вижу, что Option(null)
возвращает, тогда как Some(null)
не будет компилироваться:
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
Ну, Some
extends Option
, поэтому он наследует все, кроме get
и isEmpty
(и некоторых других методов, реализованных классом case).
Сопутствующий объект Option
имеет специальный метод apply
для работы с null
:
def apply[A](x: A): Option[A] = if (x == null) None else Some(x)
Но Some.apply
- это стандартный метод apply
, сгенерированный для класса case.
Some(null)
будет компилироваться в некоторых случаях, но он имеет тип Some[Null]
(или Option[Null]
), который может быть назначен только тогда, когда аргумент типа Option
является ссылочным типом.
scala> val a = Some(null)
a: Some[Null] = Some(null)
scala> val b: Option[String] = Some(null)
b: Option[String] = Some(null)
Вы пытаетесь назначить Some[Null]
Option[Boolean]
, но null
не является подтипом Boolean
, потому что Boolean
- тип значения (примитив снизу) и не может содержать значение null
.
Ответ 2
С точки зрения функционального программирования, заданного произвольным типом T, тип Option [T] является алгебраическим типом данных с конструкторами данных None и Some (x: T).
Это всего лишь кодированный способ сказать, что если тип T состоит из значений t1, t2, t3,...
то все значения типа Option [T] равны None, Some (t1), Some (t2), Some (t3),...
Из всего остального следует все. Например, если значение null не является значением T, то Some (null) не является значением опции [T]. Это объясняет, почему
val x: Option[Boolean] = Some(null)
не работает, а
val x: Option[Null] = Some(null)
делает.
Наконец, в частности, для Scala, кажется, есть дополнительная причуда в том, что "для удобства" можно сказать Option (null), когда они означают "Нет". Я бы ожидал, что можно также сказать Option (t), когда они означают Some (t).
Ответ 3
Короче
Option
/ \
/ \
/ \
Some None
Опция - это база контейнеров, которая может быть пустой или полной
В то время как Some (x) представляют полный, когда "x" присутствует в контейнере, None представляет пустое.
Ответ 4
Основная идея Option заключается в том, чтобы исключить использование Null в соответствии со значением по умолчанию и избежать исключения NullPointerException. Таким образом, Option может иметь значение Some или None (заменяя Null). Ознакомьтесь с этим замечательным объяснением варианта:
Scala Вариант объяснен