Котлин: как передать функцию в качестве параметра другому?
данная функция 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)
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)
о функции-члене в качестве параметра:
- класс Kotlin не поддерживает статическую функцию-член, поэтому функция-член не может быть вызвана как: Оператор:: add (5, 4)
- поэтому функция-член не может использоваться так же, как и функция первого класса.
- полезным подходом является обертывание функции с помощью лямбды. Это не элегантно, но, по крайней мере, это работает.
код:
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) }) }
по-видимому, это еще не поддерживается.
подробнее:
просто используйте ":: "перед именем метода в качестве параметра
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-- } }
первоклассные функции в настоящее время не поддерживаются в Kotlin. Там были дебаты о том, будет ли это хорошая функция, чтобы добавить. Я лично считаю, что они должны.
Comments