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
3条答案
按热度按时间x4shl7ld1#
执行此操作时:
...那么您将得到以下输出:
这是因为首先打印String "hello",然后打印
println
语句返回的任何内容,由于println
没有返回任何内容(在kotlins的世界里是kotlin.Unit
),所以它打印kotlin.Unit
。在你的情况下,你想要的可能是这样的:
zxlwwiss2#
为了给Tarmo's answer添加更多细节,
println("Happy Birthday, Rover!")
做了两件事:kotlin.Unit
你知道the function signature会返回什么结果:
fun println(message: String)
其实就是
Kotlin中的每个函数都返回 something,而
Unit
是一个特殊类型,它表示没有结果,没有值,如果你不指定返回类型,那么它就是默认的返回类型(这就是为什么在println
函数签名中没有明确声明它是返回类型)。所以这意味着,是这样的:
调用
println
,返回Unit
,所以该语句右边的表达式求值为Unit
,所以创建了一个名为nameGreeting
的变量,并赋给它一个值Unit
,ageGreeting
也是如此。这意味着当你看到这一行时:
你要创建一个字符串,包含这些变量的值,它们都是
Unit
,当你在这样的模板字符串中使用对象时,它实际上调用了它们的toString
函数--而Unit
将自己表示为"kotlin.Unit"
,所以你返回的最后一个字符串是"kotlin.Unit\nkotlin.Unit"
,这就是为什么你会看到(由于换行符,在两行上),当您使用该字符串调用println
时。Like Tarmo says,当你赋值这些问候语变量时,你需要 *assign一个字符串 * 给它们,这样当你创建最终字符串时就会使用文本。看起来你不应该在那个函数中打印这些字符串(你只想稍后打印完整的结果,对吗?),但是如果你要打印,你必须单独调用
println
,因为它不返回这些字符串。dxxyhpgq3#
在
birthdayGreeting()
函数中,您使用了两次println
。println
返回类型为Unit
。