函数中单元返回的目的是什么

Maj*_*cRa 53 kotlin

来自Kotlin文档:

如果函数没有返回任何有用的值,则其返回类型为Unit.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 
}
Run Code Online (Sandbox Code Playgroud)

单位返回功能的目的是什么?为什么有VALUE?什么是VALUE?

And*_*lav 110

目的与C或Java相同void.只有Unit是一个合适的类型,所以它可以作为泛型参数等传递.

  1. 为什么我们不称它为"Void":因为"void"这个词的意思是"没有",而且还有另一种类型Nothing,这意味着"根本没有价值",即计算没有正常完成(永久循环或扔掉)一个例外).我们无法承受意义冲突.

  2. 为什么Unit有一个值(即与Nothing不同):因为通用代码可以顺利运行.如果为通用参数T传递Unit,则为任何T编写的代码将需要一个对象,并且必须有一个对象,即Unit的唯一值.

  3. 如何访问Unit的值:因为它是一个单例对象,就这么说 Unit

  • "单位"只代表"只有一个价值的东西",它是一个传统名称,来自功能语言.我同意这个名字不是很直观,但我们没有发明一个更好的名字. (25认同)
  • `Unit.VALUE`似乎不再存在,我想你只是使用`Unit`. (2认同)
  • @AndreyBreslav,对我来说,“Unit”这个词在我看来是不存在的,意思是“什么的单位?” (2认同)
  • @AndreyBreslav,是的 [en.wikipedia.org/wiki/1](https://en.wikipedia.org/wiki/1) 导致:“它代表单个实体,计数或测量单位。”。那么实体是什么? (2认同)
  • @AlikElzin-kilaka 实际上,将一种 0 元元组称为“单元”是功能世界中的传统,因为它只有一个值。我认为这是一个正确的名称,因为根据维基百科文章,数字“一”也可以称为“单位”或“统一”。你可以不把它想象成一个单位,而是一个单位类型,即在类型的代数中具有 1 的代数性质的类型。查找“总和类型”和“产品类型”以获取更多详细信息 (2认同)

Alf*_*Moh 12

Unit存在的主要原因是由于通用原因.让我们使用Kotlin文档中的示例.

class Box<T>(t: T) {
    var value = t
}
Run Code Online (Sandbox Code Playgroud)

我们可以有

var box = Box(Unit)
Run Code Online (Sandbox Code Playgroud)

这就是为什么Unit返回一个值,以便Kotlin可以从传递给类初始化的类型推断它.当然,您也可以这样明确地写出来,

var box = Box<Unit>(Unit)
Run Code Online (Sandbox Code Playgroud)

但同样,它必须有一个返回值.现在,Kotlin中Java中的void关键字是Nothing.在Kotlin的类型层次结构中,没有什么是最后一种类型,最后一种类型是什么?(Nullable Nothing).这根本不会返回任何值.因为它根本不返回任何值,所以我们不能将它作为上述代码中的类型传递.

var box = Box(Nothing) //This will return an Error
Run Code Online (Sandbox Code Playgroud)


spy*_*yro 6

UNIT实际上包含有价值的信息,它基本上只是意味着“完成”。它只是信息返回给调用者,该方法已完成。这是一条真实的信息,因此可以将其视为方法的返回值