Котлин: как передать функцию в качестве параметра другому?



данная функция foo:



fun foo(m: String, bar: (m: String) -> Unit) {
bar(m)
}


мы можем сделать:



foo("a message", { println("this is a message: $it") } )
//or
foo("a message") { println("this is a message: $it") }


теперь, допустим, у нас есть следующая функция:



fun buz(m: String) {
println("another message: $m")
}


есть ли способ передать "buz "в качестве параметра" foo"?
Что-то вроде:



foo("a message", buz)
2365   6  

6 ответов:

использовать :: для обозначения ссылки на функцию, а затем:

fun foo(m: String, bar: (m: String) -> Unit) {
    bar(m)
}

// my function to pass into the other
fun buz(m: String) {
    println("another message: $m")
}

// someone passing buz into foo
fun something() {
    foo("hi", ::buz)
}

С Котлина 1.1 теперь вы можете использовать функции, которые являются членами класса ("Связанные Вызываемые Ссылки"), путем префикса оператора ссылки на функцию с экземпляром:

foo("hi", OtherClass()::buz)

foo("hi", thatOtherThing::buz)

foo("hi", this::buz)

о функции-члене в качестве параметра:

  1. класс Kotlin не поддерживает статическую функцию-член, поэтому функция-член не может быть вызвана как: Оператор:: add (5, 4)
  2. поэтому функция-член не может использоваться так же, как и функция первого класса.
  3. полезным подходом является обертывание функции с помощью лямбды. Это не элегантно, но, по крайней мере, это работает.

код:

class Operator {
    fun add(a: Int, b: Int) = a + b
    fun inc(a: Int) = a + 1
}

fun calc(a: Int, b: Int, opr: (Int, Int) -> Int) = opr(a, b)
fun calc(a: Int, opr: (Int) -> Int) = opr(a)

fun main(args: Array<String>) {
    calc(1, 2, { a, b -> Operator().add(a, b) })
    calc(1, { Operator().inc(it) })
}

по-видимому, это еще не поддерживается.

подробнее:

http://devnet.jetbrains.com/message/5485180#5485180

http://youtrack.jetbrains.com/issue/KT-1183

просто используйте ":: "перед именем метода в качестве параметра

fun main(args: Array<String>) {
    runAFunc(::runLines)
}


fun runAFunc(predicate: (Int) -> (Unit)) {
   val a = "five"
   if (a == "five") predicate.invoke(5) else predicate.invoke(3)

}

fun runLines(numbers: Int) {
    var i = numbers
    while (i > 0) {
        println("printed number is $i")
        i--
    }
}

Котлин 1.1

Это:: buz (если в том же классе) или Class ():: buz если разные

первоклассные функции в настоящее время не поддерживаются в Kotlin. Там были дебаты о том, будет ли это хорошая функция, чтобы добавить. Я лично считаю, что они должны.

Comments

    Ничего не найдено.