Какова цель возврата единиц в функции
Из документации Котлина:
Если функция не возвращает какое-либо полезное значение, ее возвращаемым типом является 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?
Ответы
Ответ 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