Это не вопрос о том, как это сделать, а вопрос о причинах этого.Я искал SO, документы Kotlin и googs, чтобы найти, ПОЧЕМУ люди Kotlin сделали свой синтаксис таким образом, но не могут действительно понять это.Поэтому я надеюсь, что кто-то блестящий здесь может помочь мне.
Учитывая:
private fun printResult(function: (Int, Int) -> Int, a: Int, b: Int) {
Я понимаю, что:
"function: (Int, Int)"
означает, что это функция, которую мыпроходят, и его подпись принимает два параметра Int.
Далее, я получаю это:
"-> Int"
означает, что эта функция возвращает Int
И, наконец, я получаючто:
"a: Int, b: Int"
- это обычный список аргументов / параметров, и именно здесь мы получаем фактические параметры.
Но мне это кажется неуклюжим.
Зачем пытаться поставить подпись:
"(Int, Int) -> Int"
, а затем настаивать на повторении аргументов снова:
"a: Int, b: Int"
Но если вам нужно это сделатьХорошо, но почему бы вам не повторить возврат для ясности, чтобы это было что-то вроде:
"private fun printResult(function: (Int, Int) -> Int, a: Int, b: Int): Int"
Или даже:
"private fun printResult(function: (a: Int, b: Int) -> Int) {"
Кажется, что неясный синтаксис сповторы, которые не должны быть там и / или возможность нечетких подписей, поскольку ваши функции становятся более сложными.
Что мне не хватает?
Спасибо
Пример после объяснения Форпа и Абиба - для ясности для любого, кто думает так же, как я:
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))
}