rustfmt es la herramienta oficial de Rust para el formateo automático de código. Su objetivo es asegurar que el código escrito por diferentes programadores tenga siempre la misma apariencia, siguiendo el estilo canónico de la comunidad. Al ejecutar cargo fmt, la herramienta ajusta automáticamente la indentación, la posición de las llaves {} y el uso de espacios. Esto elimina las discusiones innecesarias en las revisiones de código sobre dónde colocar un salto de línea. Si necesitas reglas personalizadas, como cambiar el ancho máximo de línea (max_width) o el tamaño de la indentación, puedes crear un archivo de configuración llamado rustfmt.toml.

clippy es un linter avanzado que analiza tu código en busca de errores lógicos, malas prácticas de rendimiento y patrones que no son “idiomáticos” (es decir, que no aprovechan la sintaxis de Rust de la mejor manera). Mientras que el compilador se enfoca en que el código sea seguro y compile, clippy se enfoca en que el código sea de alta calidad. Sus advertencias se organizan en categorías: correctness (errores de lógica), style (estética y claridad), perf (optimización de rendimiento) y pedantic (reglas extremadamente estrictas). Puedes usar cargo clippy --fix para que la herramienta intente corregir automáticamente muchos de estos problemas. En casos muy específicos donde un aviso de clippy interfiera con una implementación necesaria, puedes suprimirlo usando el atributo #[allow(clippy::nombre_del_lint)].

fn main() {
    // 1. Definición de un vector de enteros
    let numeros: Vec<i32> = vec![1, 2, 3, 4, 5];

    // 2. Patrón no idiomático: usar un bucle con índices para iterar.
    // Clippy sugeriría usar un iterador directamente para mayor claridad y seguridad.
    for i in 0..numeros.len() {
        println!("Valor en el índice {}: {}", i, numeros[i]);
    }

    // 3. Ejemplo de supresión de un lint de clippy
    // Usamos #[allow(clippy::redundant_closure)] para ignorar la advertencia
    // de que esta clausura no hace nada más que devolver su argumento.
    #[allow(clippy::redundant_closure)]
    let closure_redundante = |x: i32| -> i32 { x };

    let resultado = closure_redundante(10);
    println!("Resultado de la clausura: {}", resultado);

    // 4. Ejemplo de código que sería corregido por clippy --fix
    // Usar una comparación redundante como (x == true)
    let es_rust = true;
    let check_redunante = es_rust == true; 
    println!("¿Es Rust? {}", check_redunante);
}

Explicación del Código

  • La variable numeros es de tipo Vec<i32>, un vector que almacena números enteros.
  • El bucle for i in 0..numeros.len() utiliza la variable i como un índice entero para acceder a los elementos de numeros[i]. Aunque es código válido, clippy marcaría esto como un patrón subóptimo, sugiriendo iterar directamente sobre las referencias de numeros.
  • La variable closure_redundante se define con el atributo #[allow(clippy::redundant_closure)]. Esto le indica a clippy que ignore la advertencia que indicaría que la clausura |x: i32| -> i32 { x } es innecesaria, ya que solo devuelve lo que recibe.
  • La variable check_redunante realiza una comparación es_rust == true. clippy detectaría esto como un error de estilo/redundancia, ya que es_rust ya es un valor booleano y no hace falta compararlo con true.
  • El comando println! se utiliza en varios puntos para mostrar los valores de i, numeros[i], resultado y check_redunante en la consola.

8