返回结果中的Kotlin.单位

sgtfey8w  于 2023-01-09  发布在  Kotlin
关注(0)|答案(3)|浏览(104)
fun main() {
    val greeting = birthdayGreeting()
    println(greeting)
}
fun birthdayGreeting(): String {
        val nameGreeting= println("Happy Birthday, Rover!")
        val ageGreeting=println("You are now 5 years old!")
        return "$nameGreeting\n$ageGreeting"
    }

我是一个kotlin语言新手,最近在kotlin操场上,当我运行此代码时,我得到的输出为:

Happy Birthday, Rover!
You are now 5 years old!
kotlin.Unit
kotlin.Unit

我在网上搜索了一下,上面说当函数为void(Unit)时会发生这种情况,但这里函数的返回类型是string。那么为什么它会显示kotlin.Unit
我在期待:生日快乐,罗孚!你现在5岁了!但是我得到了:生日快乐,罗弗!你现在5岁了!科廷,Kotlin,Kotlin,Kotlin

x4shl7ld

x4shl7ld1#

执行此操作时:

val x = println("hello")
println(x)

...那么您将得到以下输出:

hello
kotlin.Unit

这是因为首先打印String "hello",然后打印println语句返回的任何内容,由于println没有返回任何内容(在kotlins的世界里是kotlin.Unit),所以它打印kotlin.Unit
在你的情况下,你想要的可能是这样的:

fun main() {
    val greeting = birthdayGreeting()
    println(greeting)
}
fun birthdayGreeting(): String {
    val nameGreeting = "Happy Birthday, Rover!"
    val ageGreeting = "You are now 5 years old!"
    return "$nameGreeting\n$ageGreeting"
}
zxlwwiss

zxlwwiss2#

为了给Tarmo's answer添加更多细节,println("Happy Birthday, Rover!")做了两件事:

  • 打印字符串到标准输出(这是一个 * 副作用 *)
  • 返回kotlin.Unit

你知道the function signature会返回什么结果:
fun println(message: String)
其实就是

fun println(message: String): Unit

Kotlin中的每个函数都返回 something,而Unit是一个特殊类型,它表示没有结果,没有值,如果你不指定返回类型,那么它就是默认的返回类型(这就是为什么在println函数签名中没有明确声明它是返回类型)。
所以这意味着,是这样的:

val nameGreeting = println("Happy Birthday, Rover!")

调用println,返回Unit,所以该语句右边的表达式求值为Unit,所以创建了一个名为nameGreeting的变量,并赋给它一个值UnitageGreeting也是如此。
这意味着当你看到这一行时:

return "$nameGreeting\n$ageGreeting"

你要创建一个字符串,包含这些变量的值,它们都是Unit,当你在这样的模板字符串中使用对象时,它实际上调用了它们的toString函数--而Unit将自己表示为"kotlin.Unit",所以你返回的最后一个字符串是"kotlin.Unit\nkotlin.Unit",这就是为什么你会看到(由于换行符,在两行上),当您使用该字符串调用println时。
Like Tarmo says,当你赋值这些问候语变量时,你需要 *assign一个字符串 * 给它们,这样当你创建最终字符串时就会使用文本。看起来你不应该在那个函数中打印这些字符串(你只想稍后打印完整的结果,对吗?),但是如果你要打印,你必须单独调用println,因为它不返回这些字符串。

dxxyhpgq

dxxyhpgq3#

birthdayGreeting()函数中,您使用了两次println
println返回类型为Unit

相关问题