tutorial español ejemplos compiler kotlin

español - Kotlin: ¿cómo pasar una función como parámetro a otra?



kotlin vs java (6)

Dada la función foo:

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

Podemos hacer:

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

Ahora, digamos que tenemos la siguiente función:

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

¿Hay alguna manera de pasar "buz" como parámetro a "foo"? Algo como:

foo("a message", buz)


Acerca de la función miembro como parámetro:

  1. La clase Kotlin no admite la función miembro estática, por lo que la función miembro no puede invocarse como: Operator :: add (5, 4)
  2. Por lo tanto, la función miembro no se puede usar de la misma manera que la función Primera clase.
  3. Un enfoque útil es ajustar la función con una lambda. No es elegante, pero al menos funciona.

código:

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) }) }


Kotlin 1.1

this :: buz (si está en la misma clase) o Class () :: buz si es diferente


Las funciones de primera clase actualmente no son compatibles con Kotlin. Se ha debatido si esta sería una buena característica para agregar. Personalmente creo que deberían.


Use :: para significar una referencia de función, y luego:

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) }

Desde Kotlin 1.1 , ahora puede usar funciones que son miembros de la clase (" Bound Callable References "), prefijando el operador de referencia de función con la instancia:

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



Simplemente use "::" delante del nombre del método como parámetro

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-- } }