Использование 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 как что-то еще, кроме возвращаемого типа?

551   7  

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 используется в определении None

object 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, нет никаких вещей, чтобы сделать (включая консоль печати) если вы что-то делаете, используйте тип вывода Unit

object 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) false else throw new RuntimeException("error") элемент другое пункт типа ничего, который является подклассом Boolean (а также любого другого AnyVal). Таким образом, все назначение допустимо для компилятора, хотя другое предложение на самом деле ничего не возвращает.

вот пример Nothing С scala.predef:

  def ??? : Nothing = throw new NotImplementedError

в случае, если вы незнакомы (и поисковые системы не могут искать на нем)??? является функцией заполнителя Scala для всего, что еще не было реализовано. Прямо как у Котлина TODO.

вы можете использовать тот же трюк для создания mock объектов: переопределить неиспользуемые методы с настраиваемой notUsed метод. Преимущество не использования ??? это то, что вы не получите компилировать предупреждения для вещей, которые вы никогда не собираетесь осуществлять.

Comments

    Ничего не найдено.