Kotlin 语法的预期含义

Kotlin Syntax Intended Meaning

这不是关于如何做到这一点的问题,而是关于其背后推理的问题。 我搜索了 SO、Kotlin 文档和 googs,以找到为什么 Kotlin 人以这种方式执行他们的语法但不能真正理解它。所以我希望这里有才华的人可以帮助我。

鉴于:

private fun printResult(function: (Int, Int) -> Int, a: Int, b: Int) {

我明白了:

"function: (Int, Int)" 

表示这是一个我们传入的函数,它的签名有两个Int参数。

此外,我明白了:

"-> Int" 

表示这个函数return是一个Int

最后,我明白了:

"a: Int, b: Int" 

是正常的arguments/parameters列表,这是我们接收实际参数的地方。

但我觉得它很笨重。

何苦要签名:

"(Int, Int) -> Int"

然后又坚持重复论证:

"a: Int, b: Int"

但是如果你必须这样做,好吧,但是为什么你不重复 return 为了清楚起见,就像这样:

"private fun printResult(function: (Int, Int) -> Int, a: Int, b: Int): Int"

甚至:

"private fun printResult(function: (a: Int, b: Int) -> Int) {"

似乎语法不清晰,重复不需要存在 and/or 随着您的函数变得更加复杂,签名不清晰的可能性。

我错过了什么?

谢谢


在 Forpas 和 Abib 的解释之后的例子——为了让像我这样思考的人清楚:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    printResult(::add, 4, 2)
    printResult(::subtract, 4, 2)
}

private fun add(a: Int, b: Int): Int {
    return a + b
}

private fun subtract(a: Int, b: Int): Int {
    return a - b
}

private fun printResult(passedInFunction: (someInt: Int, anotherInt: Int) -> Int, a: Int, b: Int) {
    // Simply takes the values of "a" and "b" and does whatever 
    // the latest version of the "passedInFunction" is set up to do.
    // It does this by passing the arguments that were given to
    // "printResult" into whatever the current version of "passedInFunction" is.
    val result = passedInFunction(a, b)
    println("result: $result")

    // Manipulates the values from the arguments passed into
    // "printResult" and passes the result into "passedInFunction" 
    // as parameters/arguments.
    println("function: " + passedInFunction(a - b, a + b))
}

abprintResult 函数的参数,而不是参数中的 function 。所以 printResult 有 3 个参数,一个函数,a,和 b,所以设计这个函数的人决定它需要 2 个参数(a 和 b)和一个转换两个 Ints 进入另一个 Int.

另一个注意事项(作为一般提示),lambda 的参数也可以命名,因此 printResult(function: (someInt:Int, anotherInt:Int)->Int, a:Int, b:Int) 也是有效的(它也有助于 IDE 使用此函数时的代码完成)

另外,根据 Kotlin 文档,最好将 lambda/function 参数放在最后一个(因此上面的示例变为 private fun printResult(a: Int, b: Int, function: (Int, Int) -> Int) ),因为在这种情况下,它可以像这样使用:

printResult(1,2) { firstInt, secondInt -> ///

假设这是 printResult 函数:

fun printResult(function: (Int, Int) -> Int, a: Int, b: Int) {
    println(function(a - b, a + b))
}

我们还定义了 multiply 函数,它具有 printResult 的参数 function 的签名:

fun multiply(x: Int, y: Int) = x * y

现在您可以这样调用 printResult

printResult(this::multiply, 5, 3)

它会打印:

16

可以看到printResult的参数ab不是function的参数。
事实上,它们甚至根本不会被用于计算 function.
的参数 所以不存在以下情况:
不明确的语法和不需要的重复and/or潜在的不明确的签名