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

Какова цель возврата единиц в функции

Из документации Котлина:

Если функция не возвращает какое-либо полезное значение, ее возвращаемым типом является Unit. Единица - это тип с одним значением - Unit.VALUE. Это значение не обязательно должно быть возвращено явно:

fun printHello(name : String?) : Unit { 
   if (name != null) 
     print("Hello, $name!") 
   else 
     print("Hi there!") 
   // We don't need to write 'return Unit.VALUE' or 'return', although we could 
}

Какова цель возврата единиц в функции? Почему там VALUE? Что это за VALUE?

4b9b3361

Ответ 1

Цель такая же, как C или Java void. Только Unit является правильным типом, поэтому его можно передать как общий аргумент и т.д.

  • Почему мы не называем это "Пустота": потому что слово "void" означает "ничего", а другой тип Nothing означает просто "нет значения вообще", т.е. вычисление не завершался нормально (зацикливался навсегда или бросал исключение). Мы не могли позволить себе столкновение значений.

  • Почему Unit имеет значение (т.е. не то же самое, что и Nothing): потому что общий код может работать плавно. Если вы передадите Unit для общего параметра T, код, написанный для любого T, будет ожидать объект, и должен существовать объект, единственное значение Unit.

  • Как получить доступ к этому значению Unit: поскольку это одноэлементный объект, просто скажите Unit

Ответ 2

Основная причина, по которой подразделение существует, объясняется общими причинами. Позвольте использовать пример из документов Kotlin.

class Box<T>(t: T) {
    var value = t
}

Мы можем иметь

var box = Box(Unit)

Вот почему Unit возвращает значение, поэтому Kotlin может вывести его из типа, переданного в инициализацию класса. Разумеется, вы также можете явно записать его так:

var box = Box<Unit>(Unit)

но все равно он должен иметь возвращаемое значение. Теперь ключевое слово void в Java в Котлине Ничего. Ничего - это последний, но один тип иерархии типов в Котлине, последний из которых Ничего? (Nullable Nothing). Это не возвращает никакой ценности. Поскольку он не возвращает никакого значения вообще, мы не можем передать его как тип в приведенном выше коде.

var box = Box(Nothing) //This will return an Error