【问题标题】:What is the purpose of Unit-returning in functions函数中Unit-return的目的是什么
【发布时间】:2014-03-26 08:12:06
【问题描述】:

来自 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 
}

函数中返回单位的目的是什么?为什么 VALUE 在那里?这个 VALUE 是多少?

【问题讨论】:

  • 我不是范畴论专家,但 AFAIK 的名字 voidunit 来自范畴论。 void 是一个没有成员的类别,unit 是一个有一个成员的类别,bool 是一个有两个成员的类别(true & false)。 void 是从 C 继承而来的,它是泛型代码的主要麻烦。通常在 Java、C# 和 C++ 中,您需要特别处理 void 情况,因为它是一种奇怪的类型(它没有价值)。 unit 略胜一筹,因为它只有一个值,这意味着不需要特殊情况。同样在 FP 中,所有函数都采用 1 个参数,因此您需要一个无关值。
  • Unit 存在是因为通用原因,代码可以顺利运行。并且它还向调用者返回该方法已经完成的信息。

标签: kotlin


【解决方案1】:

目的与 C 或 Java 的 void 相同。只有 Unit 是正确的类型,所以它可以作为泛型参数等传递。

  1. 为什么我们不叫它“Void”:因为“void”这个词的意思是“无”,还有另一种类型,Nothing,意思是“根本没有价值”,即计算没有正常完成(永远循环或抛出异常)。我们无法承受意义的冲突。

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

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

【讨论】:

  • 谢谢!我明白了它现在不是 Void 或 Nothing 的原因。但是选择“单位”对我来说有点误导。不过,我的母语不是英语。
  • "Unit" 只是代表“只有一个值的东西”,它是一个传统名称,来自函数式语言。我同意这个名字不是很直观,但我们没能发明一个更好的名字。
  • @AndreyBreslav,在我看来,Unit 这个词不能存在,意思是“什么单位?”
  • @AndreyBreslav,是的 en.wikipedia.org/wiki/1 导致:“它代表单个实体,即计数或测量单位。”。那么实体是什么?
  • @AlikElzin-kilaka 实际上,将一种 0 元元组称为“单元”是函数世界的传统,因为它只有一个值。我认为这是一个正确的名称,因为根据维基百科的文章,数字“一”也可以称为“单位”或“统一”。您可以不将其视为某物的单位,而是将其视为单位类型,即在类型的代数中具有 1 的代数性质的类型。查看“总和类型”和“产品类型”了解更多详情
【解决方案2】:

Unit存在的主要原因是Generic原因。 让我们使用 Kotlin 文档中的示例。

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

我们可以有

var box = Box(Unit)

这就是为什么 Unit 返回一个值,以便 Kotlin 可以从传递给类初始化的类型推断它。当然,你也可以显式写成这样,

var box = Box<Unit>(Unit)

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-14
      • 2015-03-04
      • 1970-01-01
      • 1970-01-01
      • 2022-11-18
      • 1970-01-01
      相关资源
      最近更新 更多