100 votes

Kotlin: Appliquer Avec vs

Quelle est la différence entre avec et de les appliquer. De 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
}

Quelle est la différence et dois-je utiliser l'un plutôt que l'autre? Aussi, il y a certains cas où l'une et l'autre ne sera pas?

101voto

Michael Points 16659

Il y a deux différences:

  1. apply accepte une instance comme le récepteur with nécessite une instance à être passé comme argument. Dans les deux cas, l'instance deviendra this dans un bloc.

  2. apply renvoie le récepteur et l' with renvoie un résultat de la dernière expression à l'intérieur de son bloc.

Je ne suis pas sûr qu'il y a peut être des règles strictes sur la fonction à choisir. En général, vous utilisez apply lorsque vous avez besoin de faire quelque chose avec un objet et de le retourner. Et quand vous en avez besoin pour effectuer certaines opérations sur un objet et revenir un autre objet, vous pouvez utiliser with ou run. Je préfère run parce que c'est plus lisible à mon avis, mais c'est une question de goût.

20voto

Nonso Biose Points 26

Voici les Similitudes et les Différences

Les similitudes

Avec et s'Applique à la fois accepter un objet tel qu'un récepteur de quelque manière que ce qu'ils sont passés.

Les différences

Avec les retours à la dernière ligne dans le lambda comme le résultat de l'expression.

Appliquer renvoie l'objet qui a été transmis en tant que récepteur comme le résultat de l'expression lambda.

Exemples

Avec

private val ORIENTATIONS = with(SparseIntArray()) {
    append(Surface.ROTATION_0, 90)
    append(Surface.ROTATION_90, 0)
    append(Surface.ROTATION_180, 270)
    append(Surface.ROTATION_270, 180)
}
ORIENTATIONS[0] // doesn't work 
// Here, using with prevents me from accessing the items in the SparseArray because, 
// the last line actually returns nothing

Appliquer

private val ORIENTATIONS = SparseIntArray().apply {
    append(Surface.ROTATION_0, 90)
    append(Surface.ROTATION_90, 0)
    append(Surface.ROTATION_180, 270)
    append(Surface.ROTATION_270, 180)
}
ORIENTATIONS[0] // Works
// Here, using apply, allows me to access the items in the SparseArray because, 
// the SparseArray is returned as the result of the expression

7voto

s1m0nw1 Points 21698

L' apply fonction

//returns receiver T, T exposed as `this`
fun <T> T.apply(block: T.() -> Unit): T 

Description

L' apply fonction est invoquée sur un récepteur T, qui sera exposé en tant qu' this dans l'expression lambda. Le récepteur devient aussi le résultat d' apply automatiquement.

L' with fonction

//return arbitrary value R, not an extension function, T exposed as `this` 
fun <T, R> with(receiver: T, block: T.() -> R): R 

Description

L' with de la fonction, par opposition à toutes les autres fonctions de l'endoscope (let, run, also, apply), n'est pas défini comme une fonction d'extension. Au lieu de cela, la fonction est appelée avec un récepteur de l'objet en tant que premier argument explicitement. Même en tant que apply, le récepteur est exposé en tant que this dans le passé lambda. Le résultat de la lambda, c'est à dire de sa dernière déclaration, devient le résultat (R) with.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X