Использование Null / Nothing / Unit в Scala
Я только что прочитал: http://oldfashionedsoftware.com/2008/08/20/a-post-about-nothing/
насколько я понимаю, Null это признак и его единственный экземпляр null.
когда метод принимает нулевой аргумент, то мы можем только передать его Null ссылка или null напрямую, но не любая другая ссылка, даже если она равна null (nullString: String = null например).
мне просто интересно, в каких случаях использование этого Null черта может быть полезна.
Есть также черта ничего, для которой я действительно не вижу больше примеров.
Я действительно не понимаю, в чем разница между использованием Nothing и Unit в качестве типа возврата, поскольку оба не возвращают никакого результата, как узнать, какой из них использовать, когда у меня есть метод, который выполняет ведение журнала, например?
у вас есть использование Unit / Null / Nothing как что-то еще, кроме возвращаемого типа?
7 ответов:
вы ничего не используете, если метод никогда не возвращается (это означает, что он не может нормально завершить возврат, он может вызвать исключение). Ничто никогда не создается и существует в интересах системы типов (цитата Джеймса ИРИ: " причина, по которой Scala имеет нижний тип, связана с его способностью выражать дисперсию параметров типа."). Из статьи, на которую вы ссылаетесь:
еще одно использование Nothing - это тип возврата для методов, которые никогда возвращаться. Оно имеет смысл, если вы думаете об этом. Если метод возвращает тип-это ничто, и не существует абсолютно никакого экземпляра ничего, тогда такой метод никогда не должен возвращаться.
ваш метод регистрации будет возвращать единицу. Существует единица измерения, поэтому она может быть возвращена. Из API docs:
Unit-это подтип scala.AnyVal. Существует только одно значение типа Unit, (), и он не представлен каким-либо объектом в базовом во время выполнения система. Метод с возвращаемым типом Unit аналогичен Java метод, который объявлен недействительным.
статья, которую вы цитируете, может ввести в заблуждение. Элемент
Nullтип есть для совместимости с виртуальная машина Java, и Java в частности.мы должны учитывать, что Скала:
- полностью объектно-ориентирован: каждое значение является объектом
- строго: каждое значение должно иметь тип
- нужно обработать
nullссылки на доступ, например, к библиотекам Java и кодтаким образом, становится необходимым для определения типа
nullзначениеNullчерта, иnullкак его единственный экземпляр.нет ничего особенно полезного в
Nullтип, если вы не тип-система или вы разрабатываете на компиляторе. В частности, я не вижу никакой разумной причины для определенияNullвведите параметр для метода, так как вы не можете передать ничего, кромеnull
у вас есть использование Unit / Null / Nothing как что-то другое, чем a тип возврата?
Unitможно использовать так:def execute(code: => Unit):Unit = { // do something before code // do something after }это позволяет передать произвольный блок кода для выполнения.
Nullможет использоваться в качестве нижнего типа для любого значения, которое может быть обнулено. Пример такой:implicit def zeroNull[B >: Null] = new Zero[B] { def apply = null }
Nothingиспользуется в определенииNoneobject None extends Option[Nothing]это позволяет назначить
Noneдля любого типаOption, потому чтоNothing'расширяет' все.val x:Option[String] = None
Я никогда не использовал
Nullтип, но вы используетеUnit, где бы вы на java использовалиvoid.Nothing- это особый тип, потому что, как уже упоминал Натан, не может быть экземпляраNothing.Nothingявляется так называемым нижним типом, что означает, что это подтип любого другого типа. Это (и параметр contravariant type), поэтому вы можете добавить любое значение вNil- этоList[Nothing]- и список будет иметь этот тип элементов.Noneи если типаOption[Nothing]. Каждая попытка доступа к значениям внутри такого контейнера вызовет исключение, потому что это единственный допустимый способ возврата из метода типаNothing.
если вы используете
Nothing, нет никаких вещей, чтобы сделать (включая консоль печати) если вы что-то делаете, используйте тип выводаUnitobject Run extends App { //def sayHello(): Nothing = println("hello?") def sayHello(): Unit = println("hello?") sayHello() }... тогда как использовать
Nothing?trait Option[E] case class Some[E](value: E) extends Option[E] case object None extends Option[Nothing]
ничего часто используется неявно. В приведенном ниже коде,
val b: Boolean =if (1 > 2) falseelse throw new RuntimeException("error")элемент другое пункт типа ничего, который является подклассом Boolean (а также любого другого AnyVal). Таким образом, все назначение допустимо для компилятора, хотя другое предложение на самом деле ничего не возвращает.
вот пример
NothingСscala.predef:def ??? : Nothing = throw new NotImplementedErrorв случае, если вы незнакомы (и поисковые системы не могут искать на нем)
???является функцией заполнителя Scala для всего, что еще не было реализовано. Прямо как у КотлинаTODO.вы можете использовать тот же трюк для создания mock объектов: переопределить неиспользуемые методы с настраиваемой
notUsedметод. Преимущество не использования???это то, что вы не получите компилировать предупреждения для вещей, которые вы никогда не собираетесь осуществлять.
Comments