Вызвать функцию более высокого порядка с параметрами - PullRequest
0 голосов
/ 06 апреля 2019

Я пытаюсь определить метод обратного вызова в Kotlin, который принимает два параметра. Как объявить лямбду для фактического вызова функции в переменной?

// actual method
fun foo(a : String, b : String) {
    // do something
}

// syntax error here
val callback : (String, String) -> Unit = foo(a, b)

// invoke method
callback.invoke("a", "b")

Ответы [ 2 ]

2 голосов
/ 06 апреля 2019

То, что вы здесь делаете, пытается назвать юнит (String, String) -> Unit.Помимо несуществующих переменных, вы получаете Unit, когда вызываете функцию.

Если вы знакомы с Java (что немного более понятно), у вас есть:

void foo(String a, String b) { ... }
BiConsumer consumer = foo(a, b); 

Что недопустимо, потому что в данном случае пустота не являетсяJava, BiConsumer.Эквивалентно, в вашем случае a (я, честно говоря, не помню, как были названы функции, но это что-то вроде) KFunction2 не является модулем.

Чтобы получить фактическую ссылку на метод, вам нужно использовать ::.Используя . в Java или Kotlin, вы вызываете функцию;Вы не возвращаете саму функцию, что, я полагаю, является вашим намерением.

val callback: (String, String) -> Unit = ::foo

В отличие от Java, вы не обязаны располагать что-либо слева от оператора.Если вам позже понадобится расширить область действия вашего метода (т. Е. Он будет в экземпляре), вы поместите его слева:

var someClassWithAFunction = ....
var callback: (String, String) -> Unit = someClassWithAFunction::foo

Но особенности использования, выходящие за рамки вопроса, не слишком важныв данный момент.

Получив ссылку на метод, вы можете вызывать его как обычную функцию (то, что вы изначально делали при назначении - callback(...)).Тем не менее, вам нужно добавить в него функцию, чтобы он был действительным синтаксисом, но я предполагаю, что вы уже делаете это, и просто ради MCVE написано так, как оно есть.

2 голосов
/ 06 апреля 2019
fun foo(a : String, b : String) {
    // do something
}

val callback : (String, String) -> Unit = ::foo
// or val callback = { a: String, b: String -> foo(a, b) }

fun main() {
    callback.invoke("a", "b")
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...