DEV Community

loading...

Kotlin - Scope Functions (let, with, run, apply & also)

Armando Pic贸n 馃嚚馃嚤
Android Engineer at Cornershop Inc. // Producer of Codalot Dev podcast // Public Speaker // Cooker // Cyclist
Updated on 銉3 min read

Empecemos viendo este c贸digo:

  name?.let{
    //...
  }
Enter fullscreen mode Exit fullscreen mode

Estoy seguro que en alg煤n momento lo has visto y sabes que es una forma de validar que name no sea nulo antes de emplear el valor dentro del bloque de c贸digo dentro de la funci贸n let. Pero 驴realmente sabes las implicancias del uso de dicha funci贸n? Si la respuesta es no, pues esta publicaci贸n es para ti.

Definiendo las scope functions

Seg煤n la documentaci贸n oficial son funciones cuyo 煤nico prop贸sito es "ejecutar un bloque de c贸digo dentro del contexto de un objeto". Creo que la explicaci贸n es algo sencilla, b谩sicamente es una forma de organizar nuestro c贸digo y hacerlo mejor le铆ble.

驴Qu茅 scope functions trae Kotlin?

B谩sicamente tenemos 5 scope functions: let, with, run, apply y also; adicionalmente hay 2 funciones extras takeIf y takeUnless que nos permitir谩n adicionar algunas validaciones de estado en medio de una cadena de invocaci贸n (o en tras palabras cuando concatenas varias scope functions) y que suelen emplearse junto con las 5 anteriores.

Como la documentaci贸n lo se帽ala hay dos elementos que distinguen a una scope function de otra:

  • la forma en que se referencia al objeto de contexto
  • el valor de retorno

Por la forma en que se referencia al objeto de contexto

La raz贸n por la que tenemos un it o un this es para simplificar o acortar el nombre de la variable original y, b谩sicamente, te dir谩 si el objeto va a recibir la lambda (para el caso del this) o si el objeto va a pasarse como argumento de la lambda (para el caso de it).

Entonces, 驴en qu茅 casos el objeto de contexto va a recibir la lambda? run, with y apply y 驴en qu茅 casos el objeto de contexto se pasar谩 como argumento? let y also.

Por el valor de retorno

Para esta situaci贸n tendremos el retorno del mismo objeto de contexto para el caso de apply y also o el valor de resultado de la lambda en el caso de let, run y with.

驴Qu茅 funci贸n elegir?

Teniendo estas dos distinciones en mente, la documentaci贸n oficial detalla cada una de las funciones y los posibles escenarios de uso. De esa misma documentaci贸n saqu茅 este cuadro que ayuda mucho a resumir lo dicho anteriormente:

Funci贸n Referencia de objeto Valor de retorno 驴Es una extension function?
let it Resultado de la lambda S铆
run this Resultado de la lambda S铆
run - Resultado de la lambda No, cuando se llama sin el objeto de contexto
with this Resultado de la lambda No, porque toma el objeto de contexto como argumento
apply this Objeto de contexto S铆
also it Objeto de contexto S铆

Tambi茅n la documentaci贸n brinda una peque帽a gu铆a de referencia:

  • Ejecuci贸n de una lambda en objetos non-null: let
  • Introducir una expresi贸n como una variable en un 谩mbito local: let
  • Configuraci贸n de un objeto: apply
  • Configuraci贸n de un objeto y computaci贸n del resultado: run
  • Ejecutar sentencias donde una expresi贸n es requerida: run a secas sin objeto de contexto ni como funci贸n extendida
  • Efectos adicionales: also
  • Agrupar llamadas a funciones en un objeto: with

takeIf y takeUnless

Estas dos funciones que vienen en la biblioteca estandar de Kotlin, no son consideradas scope functions; sin embargo, se emplean junto con ellas y sirven para realizar algunas validaciones.

La documentaci贸n oficial tiene algunos buenos ejemplos de c贸mo emplearlas.

Conclusi贸n

Me resultan super interesantes las scope functions y este art铆culo tiene por intenci贸n hacer un breve resumen de en qu茅 consisten y cuando emplearlas. Es importante practicar su uso para acostumbrarse a sus diferencias y casos de uso, dado que por lo similares que son resultado f谩cil confundirlas y equivocar su uso.

Discussion (0)