Rust

Autor/a

Pedro López Ruiz

Instalación y mantenimiento

rustup

rustup mantiene rust desde la fuente

Opción Descripción
update actualiza la instalación
self uninstall elimina rust del sistema
--version devuelve la versión de rustc (compilador)
doc --book devuelve el manual

cargo

cargo actúa hace de compilador (rustc), gestor de dependencias, generador de paquetes y package manager y compilador.

Los paquetes en rust se llaman crates.

Comandos Descripción
new name Crea un nuevo paquete con nombre name
build Genera un ejecutable dentro de name/target/debug, con la información necesaria para debugging. Este ejecutable es más grande que el definitivo. Con el argumento --release genera la versión definitiva en name/target/release
run cargo build + ejecuta el binario
check Verifica que el programa sea compilable sin hacerlo
fix --bin "name" arregla problemas menores en el código
update Actualiza las dependencias a su última revisión menor (0.8.5)

Proyecto

cargo new name genera un directorio principal con nombre name:

name
├── Cargo.toml
└── src
    └── main.rs
  • inicializa git en el directorio (--vcs para evitarlo)
  • el directorio principal recoge README, licencias, configuraciones…
  • Cargo.toml y Cargo.lock son útiles en la gestión de dependencias

Cargo.toml

Cargo.toml define manualmente el nombre, la versión y la edición de rust que utiliza el paquete

[package]
name = "name"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
rand = "0.8.5"

Las dependencias son los paquetes declarados en el preludio. rust busca las dependencia con el mismo número de revisión menor y el número de parche más alto disponible; cargo update actualiza las dependencias a la última revisión menor1.

Cargo.lock especifica las versiones utilizadas a la hora de compilar.

Sintaxis y estilo

rustfmt limpia el código de un archivo .rs para que se conforme a las reglas de estilo de Rust:

  • indentación es de cuatro espacios
  • las líneas terminan en ; (menos la última)
  • los bloques de código están delimitados por { }
  • /* Comentario dentro de una línea */
  • // Bloque de comentario
  • /// Documentación del bloque siguiente
  • ///! Documentación del bloque contenedor
  • las librerías se declara en el preludio con use
  • los macros se denotan con ! (macro!)
Estructura de un programa

El preludio precede a la función main(); a traves de use declara las librerías que van a utilizarse.

main.rs

use rand::Rng;

fn main() {
    let secret_number = rand::thread_rng().gen_range(1..=100);

    println!("The secret number is: {secret_number}");
}

  1. Las dependencias utilizan el versionado semántico para indicar la compatibilidad con otras versiones con la notación mayor.menor.parche, mayor indica cambios incompatibles en la API, menor que se añade funcionalidad a la API sin que haya incompatibilidad con versiones anteriores y parche que se corrigen errores sin afectar la compatibilidad↩︎