Uso de lógica condicional para crear varias rutas de ejecución
Supongamos que tenemos un programa que crea un archivo de copia de seguridad en función de los archivos de una carpeta. El programa consta de unas cuantas líneas de código que localizan y comprimen un conjunto de archivos. ¿Qué ocurre si decidimos que queremos agregar lógica según la cual solamente se creará un archivo de copia de seguridad cuando no se haya hecho una copia de seguridad ese día? El programa necesitará una forma de comprobar esa condición (¿se ha hecho ya una copia de seguridad?) y de hacer algo diferente en función de si la condición se cumple (si ya hay un archivo de copia de seguridad de ese día, no se hace ninguna copia de seguridad).
Crear una rama de código mediante una construcción if
Una construcción if
evalúa una expresión booleana. Si la expresión se evalúa como true
, el programa ejecuta una rama de código concreta. Este es el aspecto de la sintaxis de una construcción if
:
if <condition> then <expression>
Este es otro ejemplo que muestra un código más obvio:
let age = 66
if age > 65
then printfn "Senior citizen"
Definir una rama alternativa mediante una cláusula else
Cuando una instrucción if
se evalúa como false
, use una cláusula else
con la construcción if
para ejecutar una rama de código diferente.
Aquí se muestra cómo usar una cláusula else
:
let age = 66
if age > 65
then printfn "Senior citizen"
else printfn "Citizen"
Usar una construcción if como una expresión
Hasta el momento, hemos visto cómo usar if
y else
para crear diferentes ramas en el código. Cuando el código sigue diversas ramas, genera resultados diferentes en función de si una condición booleana se evalúa como true
o como false
. Lo que tal vez no haya tenido en cuenta, es que cuando una expresión se ejecuta, se genera un valor.
Si el código se escribe como en este ejemplo, el resultado queda patente:
let age = 64
let message = if age > 65 then "Senior citizen" else "Citizen"
printfn "%s" message
En este caso, if
y else
funcionan más como una expresión ternaria. Si una condición es true
, devuelve un valor. Si es false
, devuelve el otro valor. En cualquier caso, se devolverá un valor. Esto se aplica a todas las expresiones if
.
Volvamos a ver un ejemplo de código anterior y profundicemos:
let age = 66
if age > 65 then printfn "Senior citizen" else printfn "Citizen"
Se trata del mismo ejemplo de código que vimos antes, si bien ahora if
y else
están en la misma línea. Dado que las acciones importantes de la operación printf
se producen en la función, esta no tiene que devolver un valor real. Por lo tanto, el valor devuelto de la expresión printfn "Senior citizen"
genera un valor de tipo unit
.
Nota:
unit
es un valor que actúa como marcador de posición cuando no se devuelve ningún valor real. Puede pensar en él como void
o None
.
Otro aspecto que ha de tenerse en cuenta es que no se pueden combinar tipos. if
y else
deben devolver el mismo tipo de datos, o se producirá un error. Por ejemplo, no se puede escribir código como el del siguiente ejemplo:
let someCondition = true
let value = if someCondition then "hello" else 1 // not allowed
En este caso, if
determina que el tipo de valor devuelto es string
, de modo que else
no puede cambiar ese tipo a int
. Para que el código anterior funcione, deberemos modificarlo:
let someCondition = true
let value = if someCondition then "hello" else "1" // allowed
Usar una construcción elif
Hasta ahora, hemos visto cómo funcionan if
y else
. elif
es otra construcción que podemos usar de forma similar a if
. Al igual que una construcción if
, la construcción elif
toma un valor booleano que se debe agregar justo después de if
. La construcción elif
se ejecuta cuando la condición if
evalúa como false
. Este es un ejemplo de cómo usar elif
:
let cardValue = 1
let cardDescription = if cardValue = 1 then "Ace" elif cardValue = 14 then "Ace" else "A card"
printfn "%s" cardDescription