En Visual Basic, nous pouvons utiliser Avec une expression comme celle-ci:
With theCustomer .Name = "Coho Vineyard" .URL = "http://www.cohovineyard.com/" .City = "Redmond" End With
Je cherche quelque chose comme ça. Est-ce possible à Kotlin?
3 Réponses :
Vous pouvez utiliser la fonction avec
de la bibliothèque Kotlin Standard, par exemple :
theCustomer.apply { name = "Coho Vineyard" url = "http://www.cohovineyard.com/" city = "Redmond" }
with ()
renvoie un résultat. Cela rend le code plus propre.
Vous pouvez également utiliser la fonction d'extension apply
:
with(theCustomer) { name = "Coho Vineyard" url = "http://www.cohovineyard.com/" city = "Redmond" }
apply
- déclarée sur Toute classe
, elle peut être invoquée sur des instances de tous types, elle rend le code plus lisible. À utiliser lorsque vous devez utiliser une instance de l'objet (modifier les propriétés), exprimer la chaîne d'appels.
Il diffère de avec ()
en ce qu'il renvoie Receiver.
Quelque chose comme ça?
theCustomer?.let{ customer -> customer.Name = "Coho Vineyard" customer.URL = "http://www.cohovineyard.com/" customer.City = "Redmond" }
Mais avec
nécessite un paramètre non nullable. Je suggère d'utiliser à la place let
ou apply
.
theCustomer?.apply{ Name = "Coho Vineyard" URL = "http://www.cohovineyard.com/" City = "Redmond" }
ou
with(theCustomer) { Name = "Coho Vineyard" URL = "http://www.cohovineyard.com/" City = "Redmond" }
avec
ne nécessite certainement pas de récepteur non nul, son paramètre de type T
n'a pas de limite supérieure. Bien sûr, il est vrai que son utilisation sur une référence nullable entraînera (évidemment) que le lambda ait un this
nullable.
Kotlin fournit plusieurs fonctions de portée. Certains d'entre eux utilisent une fonction littérale avec receiver , qui permet d'écrire un code similaire à celui fourni par vous dans Visual De base. Les deux, avec
et apply
conviennent dans ce cas. Il est intéressant de noter que with
renvoie un résultat arbitraire R
tandis que apply
retourne toujours le récepteur concret sur lequel la fonction a été appelée.
Pour votre exemple, considérons les deux fonctions:
avec
En utilisant avec
, nous pouvons écrire le code comme suit:
val customer = Customer().apply { name = "Coho Vineyard" url = "http://www.cohovineyard.com/" city = "Redmond" }
La dernière expression du lambda passée à avec
ici est une affectation, qui, en Kotlin, renvoie Unit
. Vous pouvez assigner le résultat de l'appel with
à une nouvelle variable qui serait alors de type Unit
. Ce n'est pas utile et toute l'approche n'est pas très idiomatique car nous devons séparer la déclaration de l'initialisation réelle de customer
.
appliquer
Avec apply
d'autre part, nous pouvons combiner déclaration et initialisation car il renvoie son récepteur par défaut:
val customer = Customer() with(customer) { name = "Coho Vineyard" url = "http://www.cohovineyard.com/" city = "Redmond" }
Comme vous pouvez le voir, chaque fois que vous voulez initialiser un objet, préférez apply
(fonction d'extension définie sur tous les types). Voici un autre fil de discussion sur les différences entre with et apply.
kotlinlang.org/api/latest/jvm/stdlib/kotlin/with. html , kotlinlang.org/api/latest/jvm/ stdlib / kotlin / apply.html