Kotlin – Función de alcance

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:

  1. dejar
  2. correr
  3. con
  4. aplicar
  5. 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:

  1. Manera de referirse a un objeto de contexto (es decir, usando la palabra clave ‘esto’ o ‘eso’)
  2. 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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *