Las funciones pueden realizar acciones. Una cosa que puede hacer una función es devolverte un valor cuando la llamas. Este valor es el resultado.
Por ejemplo, cuando llamas a GetRandomInt(1, 10), esperas obtener un entero aleatorio entre 1 y 10.
Para cambiar el tipo de valor que quieres de tu función, cambiarías el tipo en la firma de la función. Por ejemplo:
GetNumberOfMousetrapsYouCanAfford() : int
En este ejemplo, GetNumberOfMoustrapsYouCanAfford() tiene el tipo de retorno int, por lo que siempre que llames a GetNumberOfMoustrapsYouCanAfford() en tu código, puedes esperar que devuelva un entero.
GetNumberOfMousetrapsYouCanAfford() : float
En cambio, si cambiaras el tipo a float, devolvería otro tipo de valor.
Cuando tu función tiene especificado un tipo de retorno, el cuerpo de la función (bloque de código) tiene que producir un resultado que coincida con ese tipo. Si no lo hace, el código no compilará, lo que significa que tienes un error de compilador. ¿Preparado para aprender a evitarlo?
Resultados y devolución
El resultado es el valor que una función devuelve cuando se ejecuta.
En la lección 2 se trataron las palabras clave, que son palabras especiales que se incorporan a Verse y que llevan asociadas acciones muy concretas.
En Verse, return también es una palabra clave que indica a una función que proporcione el valor resultante de la expresión que sigue a la palabra clave return.
MyFunction() : int =
return 5
OnBegin<override>()<suspend> : void =
MyFunction() # result is 5
En el ejemplo anterior, este código devolverá un valor de 5 cuando se llame a MyFunction().
Si omites el return, la función no se romperá, pero es una buena práctica incluir el return explícitamente. Si quieres saber más sobre esto, consulta Funciones.
Salidas anticipadas
Cuando tu programa ejecute una expresión return, el programa saldrá inmediatamente del bloque de código de la función. Esto significa que si colocas la expresión de retorno antes de otro código, el código que sigue no se ejecutará. Esto puede ser útil para salir anticipadamente de una función cuando se cumple una condición especificada.
La siguiente función actualiza la variable Coins basándose en CoinsPerMouseTrap. Sin embargo, la variable Coins debe tener un valor positivo para comprar una ratonera. Si Coins es negativo, la función imprime un mensaje de error y vuelve inmediatamente, porque no hay razón para ejecutar el resto del código del cuerpo de la función.
De hecho, sin return, la función disminuiría incorrectamente el valor de Coins y nunca indicaría que Coins era negativo.
var Coins : int = -10
CoinsPerMousetrap : int = 100
BuyMousetrap() : void =
if (Coins < 0):
Print("Error: Coins set to negative value")
return
set Coins = Coins - CoinsPerMousetrap
Print(“Mousetrap bought! You have {Coins} coins left.”)
Salir anticipadamente de una función con return puede introducir errores, por lo que es importante utilizarlo con cuidado. Por ejemplo, como return se ejecutará antes que Print("¡Ratonera comprada! Te quedan {Coins} monedas.”) en el código siguiente, la función nunca imprimirá el nuevo valor de Coins.
var Coins : int = 500
CoinsPerMousetrap : int = 100
BuyMousetrap() : void =
if (Coins < 0):
Print("Error: Coins set to negative value")
return
set Coins = Coins - CoinsPerMousetrap
return
Print("Mousetrap bought! You have {Coins} coins left.")
Si tienes una salida anticipada en tu código, este seguirá compilándose, pero Visual Studio Code te advertirá de que las expresiones posteriores a return no se ejecutarán.
Void en funciones sin resultado útil
A veces quieres un resultado; a veces no.
Si recuerdas los tipos de la lección 2, quizá también recuerdes que cada tipo necesita un tipo concreto de valor. La siguiente es una lista muy corta. Verse utiliza muchos tipos, pero estos son los más comunes, y son la base para utilizar variables y constantes.
| Tipo | Qué hace | Valores |
|---|---|---|
| Este tipo de valor solo puede ser verdadero o falso. | true/false |
| Un entero es un número entero (no una fracción), e | Números enteros |
| Este tipo es para valores que no son enteros, como las fracciones. | Números con puntos decimales |
| Este tipo sirve para cualquier tipo de texto. Pueden ser letras, números, signos de puntuación, espacios e incluso emojis. 😻 | Letras, números, puntuación, espacios, emojis |
Cuando crees una función que no necesite producir un resultado, puedes establecer el tipo de retorno de la función en void.
Esto significa que la última expresión del bloque de código puede producir un resultado de cualquier tipo sin generar un error del compilador, porque el tipo de la función está establecido en void.
Puedes seguir utilizando la palabra clave return para funciones de tipo void; simplemente no necesitas proporcionar un valor con la palabra clave return.
Resumen
El resultado es lo que obtienes de una función cuando la llamas.
En un bloque de código, la última expresión producirá el resultado.
Para cambiar el tipo de valor en una función, cambiarías el tipo en la firma de la función.
Return es una palabra clave que indica a la función que proporcione el valor resultante de la expresión que le sigue.
Una salida anticipada se produce cuando la palabra clave return se utiliza en un bloque de código antes del final del bloque. Esto hará que el programa salga inmediatamente de ese bloque de código, sin ejecutar el resto del código del bloque.
Void es un tipo que dice que el valor de la función no se utilizará en ningún otro sitio. O puede que solo diga que no vale para nada. Puedes utilizar void como tipo para una función que no necesita producir un resultado.