Почему существует метод Option.get

Почему метод get определен в Option, а не в Some?

Можно применить сопоставление с образцом или использовать foreach, map, flatMap, getOrElse, который является предпочтительным в любом случае без опасности исключений во время выполнения, если вызывается None.get.

Действительно ли случаи, когда метод get настолько убедителен, что это оправдывает это? Использование метода get напоминает мне Java, где "мне не нужно проверять значение null, потому что я знаю, что var установлен", а затем см. NullPointerException.

Ответ 1

Option.get иногда полезен, когда вы знаете, рассуждая, что система захвата не захвачена, что значение, которое у вас есть, не является None. Тем не менее, вы должны достичь этого только тогда, когда вы пробовали:

  • Организация этих знаний будет выражаться вашими типами.
  • Использование упомянутых методов обработки Option (flatMap, getOrElse и т.д.), и ни один из них не подходит элегантно.

Это также удобно для метаданных/интерактивного кода (REPL, рабочих листов и т.д.).

Ответ 2

Предисловие

Scala был создан с совместимостью для JVM в качестве цели.

Итак, довольно естественно, что Exception и try/catch следует рассматривать как часть языка, по крайней мере для взаимодействия Java.

С учетом этой предпосылки, теперь, с точки зрения включения интерфейсов, которые могут вызывать ошибки в алгебраических типах данных (или классы case, если вы предпочитаете).


К вопросу

Предположим, мы инкапсулируем метод get (или head для List) только в экземпляр Some.
Это означает, что мы вынуждены сопоставлять соответствие шаблону Option каждый раз, когда хотим извлечь значение. Это не выглядело бы довольно аккуратно, но это все еще возможно.

Мы могли бы getOrElse повсюду, но это означает, что я не могу сигнализировать об ошибке через стек ошибок, если использовать императивный стиль (который не запрещен в scala, последний раз, когда я проверял).

Моя точка зрения заключается в том, что getOrElse и headOption доступны для принудительного применения функционального стиля по желанию, но get и head являются хорошими альтернативами, если императив - это выбор, соответствующий задаче или предпочтению программиста.

Ответ 3

Нет веских оснований для этого. Мартин Одерски добавил его в этот коммит в 2007 году, поэтому, я думаю, нам нужно будет спросить его о его мотивах. Ранняя версия имела getOrElse семантику.

Ответ 4

Если вы просмотрите commit. Это очевидно, почему и когда он используется. Получатель используется для распаковки, когда вы уверены, что есть Some вещь в Option. Он также служил бы наследуемым методом, где None.get Выдает исключение, а Some.get распаковывает содержимое.

Ответ 5

В некоторых случаях, когда ваш Option оказывается None, нет никакого обращения и вы хотите выбросить исключение. Итак, вместо написания

myOption match {
  case Some(value) => // use value
  case None => throw new RuntimeException("I really needed that value")
}

вы можете просто написать

myOption.get // might throw an exception

Он также делает Option гораздо приятнее использовать с Java в сочетании с isDefined:

if (myOption.isDefined()) process(myOption.get());
else // it a None!