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
numeroses de tipoVec<i32>, un vector que almacena números enteros. - El bucle
for i in 0..numeros.len()utiliza la variableicomo un índice entero para acceder a los elementos denumeros[i]. Aunque es código válido,clippymarcaría esto como un patrón subóptimo, sugiriendo iterar directamente sobre las referencias denumeros. - La variable
closure_redundantese define con el atributo#[allow(clippy::redundant_closure)]. Esto le indica aclippyque 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_redunanterealiza una comparaciónes_rust == true.clippydetectaría esto como un error de estilo/redundancia, ya quees_rustya es un valor booleano y no hace falta compararlo contrue. - El comando
println!se utiliza en varios puntos para mostrar los valores dei,numeros[i],resultadoycheck_redunanteen la consola.
N° 8