Etiquetas

Contenido anterior

En la entrada anterior vimos cómo crear variables inmutables y mutables (let y let mut) .

Ahora vamos a estudiar las cosntantes que van a darnos alguna ventajilla sobre todo si lo que quieres es un valor global (sea visto por todo el código) que no cambie nunca.

Crear una constante es algo tan sencillo como lo siguiente:

const MENSAJE:&str = "Soy PEREDAFP";
fn main() {
println!("Hola Mundo {}", MENSAJE);
}

En entradas siguientes veremos que es esto de &str, para lo que vamos a tratar aquí nos basta saber que es la forma de crear una cadena.

En las constantes es necesario indicar el tipo siempre. Si queremos crear una constante llamada AUMENTO que contenga un 1: const AUMENTO: i32 = 1;

Si el nombre de la constante no está formado todo por letras mayúsculas el compilador mostrará un aviso:

const mensaje:&str = "Soy PEREDAFP";
  |       ^^^^^^^ help: convert the identifier to upper case: `MENSAJE`

Volveremos a hablar de const al tratar punteros y una cosa muy curiosa de concurrencia.

Habrás observado que todo programa de Rust contiene la palabra clave fn seguido de paréntesis (para definición de una función un poco más adelante) y el código está envuelto por {}.

Cada bloque de código que es separado del resto por {} es un ámbito distinto. En un ámbito únicamente se pueden utilizar las variables creadas en él y las creadas en ámbitos superiores.

Por ejemplo ámbito con variable de ámbito superior podrás comprobar que variable1 es accesible tanto dentro como fuera de las llaves. Sin embargo este código no compila e indica que variable1, en la línea7, no está definida en ese ámbito (scope), claro la hemos creado al entrar en las llaves y al salir de ellas Rust la ha eliminado y es imposible acceder a una variable que no existe.

¿Y a qué viene todo esto? si recuerdas en el artículo anterior hablamos de que CASI todas las líneas de un programa Rust deben terminar con ; y también dijimos que las que no terminan con ; son las más interesantes (bueno, esto era para darle un poco de emoción al asunto).

También habrás leído que Rust es un lenguaje basado en expresiones. Pero ¿Qué es una expresión? una expresión devuelve un valor. Si una línea, o líneas, de código no devuelve un valor se denomina sentencia. Cuando utilizas let para crear una variable no se devuelve ningún valor (sentencia), pero la parte de la derecha del igual sí debe devolver un valor que será asignado a dicha variable. En este ejemplo puedes ver la diferencia entre sentencia y expresión. Prueba a cambiar la línea 3 por let variable2 = let variable3 = 2; y lee los comentarios que muestra el compilador.

Claro, let variable3 = 2 no devuelve ningún valor ya que es una sentencia y el let de más a la izquierda está esperando un valor que poder asignar a su variable2 del alma.

Una de las cosas más interesantes que tiene Rust es que cualquier expresión puede ser una sentencia si termina con ; y puede ser una expresión pura y dura si no termina en ; Ahora igual no le ves mucho el sentido, pero cuando veamos el tema funciones comprenderás la importancia de todo esto.

Vamos a estudiar estos dos códigos:

Son prácticamente iguales. Si en código 2 te olvidas del» :?» que aparece entre los {} y del ; en el que termina la línea 4 son el mismo código.

Pero el primero muestra un 2 en pantalla y el segundo () ¿Por qué? Porque el primero en la línea 4 , y antes de salir del ámbito que hemos creado con las {},termina con una expresión variable1 + 1 (observa que no tiene punto y coma) y por tanto devuelve el valor, en este caso, 2 y el segundo termina en variable1 + 1;(termina con punto y coma) y por tanto es una sentencia. Los bloques son expresiones y si terminan con una línea sin ; devuelve un valor y en caso contrario devuelve () que no es otra cosa que una tupla vacía (el término tupla lo estudiaremos un poco màs adelante)

Como ejercicio de este artículo vamos a jugar un poco con este código obtenido de rust by example. Nuestro trabajo va a consistir en quitar y poner ; en las líneas 10 y 15. Explicaremos a continuación el resultado en cada caso

Hasta la siguiente.