Kotlin: Appliquer vs avec

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:

  1. 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.

  2. 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.

La fonction d’ 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.

La 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 .