Подтвердить что ты не робот

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)
                                     ^
4b9b3361

Ответ 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 Вариант объяснен