Kotlin: comment passer une fonction en paramètre d'une autre?
La fonction foo :
fun foo(m: String, bar: (m: String) -> Unit) {
bar(m)
}
Nous pouvons faire:
foo("a message", { println("this is a message: $it") } )
//or
foo("a message") { println("this is a message: $it") }
Maintenant, disons que nous avons la fonction suivante:
fun buz(m: String) {
println("another message: $m")
}
Est-il un moyen pour que je puisse passer "buz" en tant que paramètre à "toto" ?
Quelque chose comme:
foo("a message", buz)
Vous devez vous connecter pour publier un commentaire.
Utilisation
::
pour indiquer une référence à une fonction, puis:Depuis Kotlin 1.1 vous pouvez maintenant utiliser les fonctions qui sont les membres de la classe ("Lié Appelable Références"), par la préfixation de la fonction d'opérateur de référence à l'instance:
fun something() { foo("hi", { buz(it) }) }
this::function
bar: ((m: String) -> Unit)?
m
est pour foo, l'autre paramètre est le paramètre nom de la fonction type passé en variable de bar à la fonction.bar
... êtes-vous désireux de curry un paramètre? Voir ici: github.com/MarioAriasC/funKTionale/wiki/Currying Ou de poser une autre question dans le Débordement de la Pile avec votre exemple, parce que je ne suis pas sûr de ce que vous demandez.À propos de la fonction de membre en tant que paramètre:
Opérateur::ajouter(5, 4)
code:
apparemment ce n'est pas encore prise en charge.
plus d'infos:
http://devnet.jetbrains.com/message/5485180#5485180
http://youtrack.jetbrains.com/issue/KT-1183
Juste utilisation de "::" devant le nom de la méthode
foo(::bar)
Sortie :Hello World
Kotlin 1.1
utilisation
::
à la méthode de référence.comme
Si vous souhaitez passer setter et getter méthodes.
Utilisation:
Jason Minard réponse est bonne. Cela pourrait également être réalisé à l'aide d'un
lambda
.Qui peut être appelé avec
foo("a message", buz)
.Vous pouvez également vous rendre tout ceci un peu plus SEC à l'aide d'un
typealias
.De première classe de fonctions sont actuellement pas pris en charge dans Kotlin. Il y a eu un débat quant à savoir si ce serait un bon élément à ajouter. Personnellement, je pense qu'ils devraient.