fun main(){
val cal = cals(15,3,"/")
    println(cal)
}

fun cals(num1:Int,num2:Int,operation:String){

     when (operation) {
        "+" -> num1 + num2
        "-" -> num1 - num2
        "*" -> num1 * num2
        "/" -> num1 / num2
        else -> 0
    }

}

上面的代码给出了"Kotlin.Unit"错误的原因以及如何修复它?谢谢.

我try 了一些方法,它起作用了,但我不理解它.以下是代码:

fun main(){
val cal = cals(15,3,"/")
    println(cal)
}

fun cals(num1:Int,num2:Int,operation:String):Int {

    return when (operation) {
        "+" -> num1 + num2
        "-" -> num1 - num2
        "*" -> num1 * num2
        "/" -> num1 / num2
        else -> 0
    }

}

推荐答案

与Java中的方法不同,Kotlin函数必须返回值,在Java中,它们的返回类型可以是void,这意味着它们没有返回值.

那么,如何编写只有副作用的函数呢?例如,println返回什么?从Kotlin的Angular 来看,Java void函数返回什么?答案是它们的返回类型是Unit,返回值是Unit.类型Unit只有一个有效值-Unit.

默认情况下,如果不在块体函数中编写返回类型,就像在第一个代码片段中一样,返回类型是Unit,这正是打印kotlin.Unit的原因.

请注意,第一个代码片段中的when表达式对函数返回的内容没有任何影响.通常允许将随机表达式作为它们自己的"语句"放在函数体中.例如,此函数进行编译,但不执行任何有用的操作:

fun foo() {
    1
    Unit
    7 + 7
    "foo"
    null
    Math.E
}

因此,要解决此问题,您可以指定返回类型和所需的值return.这会阻止Kotlin编译器在其中隐式插入return Unit.

或者,使用表达式体函数:

fun cals(num1:Int,num2:Int,operation:String) =
     when (operation) {
        "+" -> num1 + num2
        "-" -> num1 - num2
        "*" -> num1 * num2
        "/" -> num1 / num2
        else -> 0
    }

第一行末尾的等号指示它是一个表达式体函数,这会导致编译器try 从您使用的when表达式推断返回类型.

Kotlin相关问答推荐

如何将时间值格式化为00:00和00:00:00 Kotlin?""""

在Kotlin 有更好的结合方式?

"Kotlin中的表达式

我可以更改方法中泛型类的类型参数边界吗?

Kotlin - 如何避免在密封类的 when() 语句中转换第二个变量

返回 kotlin 中的标签和 lambda 表达式

将 SharedPreferences 中的值公开为流

如何在 kotlin 中通过反射设置委托属性值?

如何在 Kotlin for Android 上使用setTextColor(hexaValue),

Koin Android:org.koin.error.NoBeanDefFoundException

Kotlin 中 lambda 表达式中的默认参数

Kotlin get字段注释始终为空

未在IntelliJ IDEA上运行临时文件

Jacoco在Gradle 7.0.2和Kotlin 1.5.10上失败

在Kotlin中为Android编写库会有开销吗?

Kotlin Android:属性委托必须有一个 'getValue(DashViewModel, KProperty*>)' 方法

使用 kotlin 每 3 位数添加逗号或点

Kotlin 中内部可见性修饰符的范围

如何在 Intellij Idea 中运行 Kotlin 函数

对有延迟的 Rxjava 可观察对象进行单元测试