Quelle est la différence entre avec et appliquer. D’après ce que je sais, le code suivant fait la même chose:
swingElement.apply { minWidth = ENABLED_COLUMN_WIDTH maxWidth = ENABLED_COLUMN_WIDTH preferredWidth = ENABLED_COLUMN_WIDTH } with(swingElement) { minWidth = ENABLED_COLUMN_WIDTH maxWidth = ENABLED_COLUMN_WIDTH preferredWidth = ENABLED_COLUMN_WIDTH }
Y a-t-il une différence et devrais-je utiliser l’un sur l’autre? En outre, y a-t-il des cas où l’un travaillerait et l’autre pas?
Il y a deux différences:
apply
accepte une instance en tant que récepteur alors que with
requirejs qu’une instance soit transmise en tant qu’argument. Dans les deux cas, l’instance deviendra this
dans un bloc.
apply
renvoie le destinataire et renvoie un résultat de la dernière expression dans son bloc.
Je ne suis pas sûr qu’il puisse y avoir des règles ssortingctes sur la fonction à choisir. Habituellement, vous utilisez apply
lorsque vous devez faire quelque chose avec un object et le renvoyer. Et lorsque vous devez effectuer certaines opérations sur un object et renvoyer un autre object, vous pouvez l’utiliser with
ou run
. Je préfère run
car c’est plus lisible à mon avis mais c’est une question de goût.
apply
//returns receiver T, T exposed as `this` fun T.apply(block: T.() -> Unit): T
La description
La fonction apply
est appelée sur un récepteur T
, qui sera exposé comme this
dans l’expression lambda transmise. Le récepteur devient également le résultat de l’ apply
automatiquement.
with
fonction //return arbitrary value R, not an extension function, T exposed as `this` fun with(receiver: T, block: T.() -> R): R
La description
La fonction with
, par opposition à toutes les autres fonctions de scope ( let
, run
, also
, apply
), n’est pas définie comme une fonction d’extension . Au lieu de cela, la fonction est invoquée avec un object récepteur comme premier argument explicitement. De même que pour apply
, le récepteur est exposé comme this
dans le lambda passé. Le résultat de la lambda, c’est-à-dire sa dernière déclaration, devient le résultat ( R
) de with
.