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))
}
a
和 b
是 printResult
函数的参数,而不是参数中的 function
。所以 printResult
有 3 个参数,一个函数,a
,和 b
,所以设计这个函数的人决定它需要 2 个参数(a 和 b)和一个转换两个 Int
s 进入另一个 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
的参数a
和b
不是function
的参数。
事实上,它们甚至根本不会被用于计算 function
.
的参数
所以不存在以下情况:
不明确的语法和不需要的重复and/or潜在的不明确的签名
这不是关于如何做到这一点的问题,而是关于其背后推理的问题。 我搜索了 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))
}
a
和 b
是 printResult
函数的参数,而不是参数中的 function
。所以 printResult
有 3 个参数,一个函数,a
,和 b
,所以设计这个函数的人决定它需要 2 个参数(a 和 b)和一个转换两个 Int
s 进入另一个 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
的参数a
和b
不是function
的参数。
事实上,它们甚至根本不会被用于计算 function
.
的参数
所以不存在以下情况:
不明确的语法和不需要的重复and/or潜在的不明确的签名