Hay varias funciones en la biblioteca estándar de Kotlin que ayudan en la ejecución de un bloque de código dentro del contexto de un objeto. Llamar a estas funciones en un objeto con expresión lambda crea un alcance temporal. Estas funciones se denominan funciones de alcance . Podemos acceder al objeto de estas funciones sin su nombre. ¡Suena confuso! Veamos un ejemplo,
Ejemplo: sin usar la función de alcance
Kotlin
class Company() { lateinit var name: String lateinit var objective: String lateinit var founder: String } fun main() { // without using scope function // creating instance of Company Class val gfg = Company() // initializing members of the class gfg.name = "GeeksforGeeks" gfg.objective = "A computer science portal for Geeks" gfg.founder = "Sandeep Jain" println(gfg.name) }
Producción:
GeeksforGeeks
Ejemplo: uso de la función de alcance
Kotlin
class Company() { lateinit var name: String lateinit var objective: String lateinit var founder: String } fun main() { // using scope function val gfg = Company().apply { // don't need to use object // name to refer members name = "GeeksforGeeks" objective = "A computer science portal for Geeks" founder = "Sandeep Jain" } println(gfg.name) }
Producción:
GeeksforGeeks
Explicación
Debe haber notado que cuando no estamos usando la función de alcance, necesitamos escribir el nombre del objeto cada vez para referirnos a los miembros de la clase. Mientras usamos la función de alcance, podemos referirnos directamente a los miembros sin el nombre del objeto. Esta es una de las formas de usar la función de alcance. Aprenderemos más sobre ellos en este artículo.
Funciones de alcance
Cada función de alcance tiene casos de uso bien definidos, aunque todos tienen casi el mismo resultado. Ahora veamos cada función de alcance y sus casos de uso:
Aplicación del uso de funciones de alcance.
Las funciones de alcance hacen que el código sea más claro , legible y conciso , que son las características principales del lenguaje Kotlin.
Tipos de funciones de alcance
Hay cinco tipos de funciones de alcance:
- dejar
- correr
- con
- aplicar
- además
Cada una de estas funciones es bastante similar en naturaleza con pequeñas diferencias. A menudo es confuso decidir qué función usar y cuándo. Entonces, necesitamos saber cuáles son las diferencias entre estas funciones y sus casos de uso.
Diferencias en estas funciones:
Existen principalmente dos diferencias entre estas funciones:
- Manera de referirse a un objeto de contexto (es decir, usando la palabra clave ‘esto’ o ‘eso’)
- valor devuelto (es decir, devuelve ‘objeto de contexto’ o ‘resultado lambda’)
Nota: El objeto de contexto se refiere al objeto en el que estamos usando las funciones de alcance. Como en nuestro ejemplo anterior, ‘gfg’ es nuestro objeto de contexto
Tabla de funciones de alcance:
Función |
Referencia de objeto |
Valor devuelto |
---|---|---|
dejar |
eso |
resultado lambda |
correr |
este |
resultado lambda |
con |
este |
resultado lambda |
aplicar |
este |
Objeto de contexto |
además |
eso |
Objeto de contexto |
1. dejar funcionar
Context object : it Return value : lambda result
Caso de uso:
La función let se usa a menudo para proporcionar llamadas de seguridad nulas. Use el operador de llamada segura (?.) Con ‘let’ para seguridad nula. Ejecuta el bloque solo con el valor no nulo.
Ejemplo:
Kotlin
fun main() { // nullable variable a // with value as null var a: Int? = null // using let function a?.let { // statement(s) will // not execute as a is null print(it) } // re-initializing value of a to 2 a = 2 a?.let { // statement(s) will execute // as a is not null print(a) } }
Producción:
2
Explicación:
Como puede ver, cuando el valor de ‘a’ es ‘nulo’, la función permite simplemente evitar el bloque de código. Por lo tanto, resuelve la mayor pesadilla de los programadores: NullPointerException.
2. aplicar función
Context object : this Return value : context object
Caso de uso:
Como su nombre lo indica: «Aplicar estos al objeto». Se puede usar para operar en miembros del objeto receptor principalmente para inicializar miembros.
Ejemplo:
Kotlin
class Company() { lateinit var name: String lateinit var objective: String lateinit var founder: String } fun main() { Company().apply { // same as founder = “Sandeep Jain” this.founder = "Sandeep Jain" name = "GeeksforGeeks" objective = "A computer science portal for Geeks" } }
3. con función
Context object : this Return value : lambda result
Caso de uso:
Uso recomendado de ‘with’ para llamar a funciones en objetos de contexto sin proporcionar el resultado lambda.
Ejemplo:
Kotlin
class Company() { lateinit var name: String lateinit var objective: String lateinit var founder: String } fun main() { val gfg = Company().apply { name = "GeeksforGeeks" objective = "A computer science portal for Geeks" founder = "Sandeep Jain" } // with function with(gfg) { // similar to println( "${this.name}" ) println(" $name ") } }
Producción:
GeeksforGeeks
4. función de ejecución
Context object : this Return value : lambda result
La función ‘ejecutar’ se puede decir como la combinación de las funciones ‘let’ y ‘with’.
Caso de uso:
Se usa cuando el objeto lambda contiene tanto la inicialización como el cálculo del valor devuelto. Usando run podemos realizar llamadas de seguridad nulas, así como otros cálculos.
Ejemplo:
Kotlin
class Company() { lateinit var name: String lateinit var objective: String lateinit var founder: String } fun main(args: Array<String>) { println("Company Name : ") var company: Company? = null // body only executes if // company is non-null company?.run { print(name) } print("Company Name : ") // re-initialize company company = Company().apply { name = "GeeksforGeeks" founder = "Sandeep Jain" objective = "A computer science portal for Geeks" } // body executes as // 'company' is non-null company?.run { print(name) } }
Producción:
Company Name : Company Name : GeeksforGeeks
Explicación:
Cuando el valor de ‘compañía’ es nulo, el cuerpo de la ejecución simplemente se ignora. Cuando no es nulo, el cuerpo se ejecuta.
5. también funcionan
Context object : it Return value : context object
Caso de uso:
Se usa cuando tenemos que realizar operaciones adicionales cuando hemos inicializado los miembros del objeto.
Ejemplo:
Kotlin
fun main() { // initialized val list = mutableListOf<Int>(1, 2, 3) // later if we want to perform // multiple operations on this list list.also { it.add(4) it.remove(2) // more operations if needed } println(list) }
Producción:
[1, 3, 4]
Referencias de objetos
Hay dos formas de hacer referencia a objetos en las funciones de alcance:
1. esto
Podemos hacer referencia al objeto de contexto mediante una palabra clave de receptor lambda: this . esta palabra clave hace referencia a objetos en las funciones ‘ejecutar’, ‘con’ y ‘aplicar’ .
Ejemplo:
Kotlin
Company().apply { // same as : name = "GeeksforGeeks" this.name = "GeeksforGeeks" this.founder = "Sandeep Jain" this.objective = "A computer science portal for Geeks" }
Nota: Podemos excluir esta palabra clave para referirnos a miembros de la clase.
2. eso
Las funciones ‘let’ y ‘also’ se refieren al contexto del objeto como un argumento lambda.
Ejemplo:
Kotlin
Company().let { it.name = "GeeksforGeeks" it.founder = "Sandeep Jain" it.objective = "A computer science portal for Geeks" }
Valores devueltos
Hay dos tipos de valores de retorno que una función de ámbito puede devolver:
1. Resultado lambda
Si escribimos cualquier expresión al final del bloque de código, se convierte en el valor de retorno de la función de alcance. El valor devuelto para las funciones ‘let’, ‘run’ y ‘with’ es el resultado lambda.
Ejemplo:
Kotlin
class Company { var name: String = "GeeksforGeeks" var founder: String = "Sandeep Jain" var objective: String = "A computer science portal for Geeks" } fun main() { val founderName: String = with(Company()) { // 'founder' is returned by 'with' function founder } println("GfG's Founder : $founderName") }
Producción:
GfG's Founder : Sandeep Jain
2. Objeto de contexto
Las funciones ‘aplicar’ y ‘también’ devuelven el propio objeto de contexto. En este caso, no necesitamos especificar el valor devuelto. El objeto de contexto se devuelve automáticamente.
Ejemplo:
Kotlin
class Company { var name: String = "GeeksforGeeks" var founder: String = "Sandeep Jain" var objective: String = "A computer science portal for Geeks" } fun main() { val gfg = Company().apply { // any statement(s) } // gfg is an object of class Company as // return of apply() is context object print("GfG's Founder : ${gfg.founder}"); }
Producción:
GfG's Founder : Sandeep Jain
Resumen
- Las funciones de alcance hacen que el código sea más legible, claro y conciso.
- Referencia de objeto: ‘esto’ y ‘eso’.
- Valor de retorno: objeto de contexto y resultado lambda.
- let : trabajar con objetos anulables para evitar NullPointerException.
- aplicar: cambiar la configuración del objeto.
- ejecutar: operar en un objeto anulable, ejecutando expresiones lambda.
- también: añadir operaciones adicionales.
- with : operando en objetos no nulos.
Publicación traducida automáticamente
Artículo escrito por ashutosh365 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA