将单位类型分配给变量

时间:2019-11-14 09:06:21

标签: kotlin

如果在Kotlin中为变量分配Unit类型会怎样?

让我们以这小段代码为例:

val list = listOf("Hey", "this", "code", "runs")
val unit = list.forEach {
    print(it.plus(" "))
}

输出:

  

嘿,这段代码可以运行

为什么此代码运行?在此示例中,val unit的值是什么?我的意思是,应该没有一个unit.invoke()函数实际运行代码吗?

提前谢谢!

2 个答案:

答案 0 :(得分:4)

在Kotlin中,Unit是一种只有一个值的类型:对象Unit

它与Java中的void类型具有相同的用途,但实现方式不同。 (这是因为Kotlin从功能性语言中借用了想法,在功能性语言中每个表达式都有一个值。因此,如果一个函数没有有用的返回值,它将返回Unit。这将它与从不 return,以Nothing类型声明,该类型具有 no 值。)

您的代码完全有效; forEach()执行并打印其输出,然后返回Unit的值。 (forEach()是您仅因其副作用而不是其返回值而调用 的那些函数之一。这就是为什么您通常不会为返回值做任何事情的原因;但是您已经表明可以,如果您真的愿意!)

因此,您的unit被推断为类型Unit,并且将被分配Unit值。

您可以通过在以后进行打印来检查它:

println(unit)

将显示kotlin.Unit,这是对toString()值调用Unit的结果。

答案 1 :(得分:3)

  

为什么此代码运行?

它为Kotlin语言提供了语义和句法意义。变量的两个初始化都是它们前面的函数的返回值。

-

  

在此示例中,val单位的值是什么?

单位Unit-like void in Java-因为foreach返回Unit

val unit : Unit = list.forEach {
    print(it.plus(" "))
}

-

  

应该没有unit.invoke()函数实际运行代码吗?

变量{em> unit 通过执行forEach进行初始化。为了获得结果,它调用循环,该循环执行print(it.plus(" "))

编辑

  

如果在Kotlin中将单元类型分配给变量会怎样?

什么都没有。无需保存/存储它。