Котлин Синтаксис Предполагаемое значение - PullRequest
0 голосов
/ 19 февраля 2019

Это не вопрос о том, как это сделать, а вопрос о причинах этого.Я искал 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))
}

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Скажем, это функция printResult:

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

, и мы также определяем функцию multiply, которая имеет сигнатуру аргумента function из printResult:

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

Теперь вы можете вызвать printResult следующим образом:

printResult(this::multiply, 5, 3)

, и он напечатает:

16

Вы можете видеть, что аргументы a и b из printResult не являются аргументами function.На самом деле они даже не использовались бы даже для расчетов аргументов function.Так что нет ни одного случая: нечеткий синтаксис с повторами, которых там не должно быть, и / или вероятность нечетких подписей

0 голосов
/ 19 февраля 2019

a и b являются аргументами функции printResult, а не function в аргументе.Таким образом, printResult принимает 3 аргумента, функцию, a и b, поэтому любой, кто разработал эту функцию, решил, что ей нужны 2 параметра (a и b) и функция, которая преобразует два Int в другой * 1009.*.

В другом примечании (в качестве общего совета) аргументы лямбда-символов также могут быть названы, поэтому printResult(function: (someInt:Int, anotherInt:Int)->Int, a:Int, b:Int) также допустим (также помогает при завершении кода IDE при использовании этой функции)

Кроме того, в дополнение к этому, согласно документации Kotlin, лучше указывать аргументы лямбда / функции в качестве последнего (поэтому приведенный выше пример становится private fun printResult(a: Int, b: Int, function: (Int, Int) -> Int)), потому что в этом случае его можно использовать какитак:

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

...