Retorno de funciones y jerarquía de tipos en Kotlin

Kotlin es un lenguaje de programación de propósito general tipificado estáticamente desarrollado por JetBrains, que ha creado IDE de clase mundial como IntelliJ IDEA, PhpStorm, código de aplicación, etc. Fue presentado por primera vez por JetBrains en 2011 y es un nuevo lenguaje para JVM. Kotlin es un lenguaje orientado a objetos y un «lenguaje mejor» que Java, pero aún así es totalmente interoperable con el código Java.

Jerarquía de tipos

Todos los tipos de objetos de Kotlin están organizados en una jerarquía de relaciones de subtipo/supertipo. Any es el equivalente de la clase Object de Java. En Kotlin, el tipo superior se llama Any. Esto es análogo al tipo de objeto de Java. El tipo Any define los conocidos métodos toString, hashCode y equals. También define los métodos de extensión apply, let y to, entre otros. Funciones de Orden Superior y Programación Funcional. El tipo Unit es el equivalente de void en Java. Tener un tipo de Unidad es común en un lenguaje de programación funcional, y la distinción entre vacío y Unidad es sutil. Void no es un tipo, sino un caso límite especial que se usa para indicar al compilador que una función no devuelve ningún valor. Unit es un tipo propio, con una instancia singleton, también conocida como Unit o().

Cuando una función se define como una Unidad de retorno, devolverá la instancia de la unidad singleton. Esto da como resultado una mayor solidez del sistema de tipos, ya que ahora todas las funciones se pueden definir con un valor de retorno, incluso si es solo del tipo Unidad, y las funciones que no tienen argumentos se pueden definir como aceptando el tipo Unidad. La diferencia más notable entre Kotlin y Java es la adición de un tipo inferior, Nothing, que es un tipo que no tiene instancias. Al igual que Any es una superclase de todos los tipos, Nothing es la subclase de todos los tipos. Para aquellos que son nuevos en el concepto de un tipo de fondo, puede parecer extraño tener ese tipo, pero tiene varios casos de uso.

En primer lugar, se puede usar Nothing para informar al compilador que una función nunca se completa normalmente; por ejemplo, podría repetirse para siempre o lanzar siempre una excepción. Otro ejemplo son las colecciones inmutables vacías. Se podría asignar una lista vacía de Nothing a una referencia, excepto una lista de strings, y debido a que la lista es inmutable, no hay peligro de que se agregue una string a dicha lista. Por lo tanto, estos valores vacíos se pueden almacenar en caché y reutilizar. Esta es en realidad la base de la implementación de las funciones estándar de la biblioteca emptyList(), emptySet(), etc.

Retorno de función

Para devolver un valor de una función, usamos la palabra clave return con el valor o expresión que queremos devolver:

Kotlin

fun addTwoNumbers(a: Int, b: Int): Int {
  return a + b
}

Tenga en cuenta que especificamos el valor de retorno de la función. De forma predeterminada, devuelve los resultados de la función anonima o la función envolvente más cercana. Entonces, en una función anidada, esto regresará solo desde la función más interna:

Kotlin

fun largestNumber(a: Int, b: Int, c: Int): Int {
  fun largest(a: Int, b: Int): Int {
    if (a > b) return a
    else return b
  }
  return largest(largest(a, b), largest(b, c))
}

En este ejemplo algo artificial, la función anidada más grande regresa solo de sí misma. Si la función más interna es una función anónima, eso aún cuenta para fines de devolución:

Kotlin

fun printLessThanTwo() {
  val list = listOf(1, 2, 3, 4)
  list.forEach(fun(x) {
    if (x < 2) println(x)
    else return
  })
  println("This line will still execute")
}

Si necesitamos devolver un valor de un cierre, debemos calificar el retorno con una etiqueta; de lo contrario, el retorno sería para la función externa. Una etiqueta es solo una string que termina con una @:

Kotlin

fun printUntilStop() {
  val list = listOf("a", "b", "stop", "c")
  list.forEach stop@ {
    if (it == "stop") return@stop
    else println(it)
  }
}

No necesitamos especificar la etiqueta, en cuyo caso se puede usar una etiqueta implícita. Las etiquetas implícitas son el nombre de la función que aceptó el cierre. Si se define una etiqueta, no se genera la etiqueta implícita:

Kotlin

fun printUntilStop() {
  val list = listOf("a", "b", "stop", "c")
  list.forEach {
    if (it == "stop") return@forEach
    else println(it)
  }
}

Publicación traducida automáticamente

Artículo escrito por eralokyadav2019 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 *