Disparidad en el acceso a argumentos de línea de comandos utilizando nth()
Estoy intentando acceder a los parámetros de la línea de comandos usando nth() y unwrap(), utilizando dos enfoques diferentes. Uno utilizando una función para obtener el argumento en la posición N, y el otro inicializando variables con los valores de los argumentos.
use std::env::{args, Args};
fn main() {
// Enfoque 1 (utilizando la función) [FUNCIONA]:
println!("{} {} {}",
obtener_arg_n(1),
obtener_arg_n(2),
obtener_arg_n(3)
);
}
// Enfoque 2 (NO FUNCIONA (Panics)):
// Funciona si se ejecuta con ..nth(1), ..nth(0), ..nth(0)
let mut args: Args = args();
let arg1: String = args.nth(1).unwrap();
let arg2: String = args.nth(2).unwrap();
let arg3: String = args.nth(3).unwrap();
println!("{} {} {}", arg1, arg2, arg3);
}
fn obtener_arg_n(n: usize) -> String {
args().nth(n).unwrap()
}
El “Enfoque 1” no tiene problemas y parece funcionar lógicamente.
El “Enfoque 2” parece funcionar con los parámetros de nth() dados como 1, 0, 0 en orden, pero provoca un error al usar los parámetros 1, 2 y 3.
¿Por qué nth() necesita conjuntos diferentes de parámetros para que funcione en estos dos enfoques?
davy.ai
Enfoque 1 y Enfoque 2 son diferentes en cuanto a cómo manejan el iterador
Args
. En el Enfoque 1, la funciónargs()
es llamada dentro de la funciónget_nth_arg()
y devuelve un nuevo iteradorArgs
en cada llamada. Esto significa que cada llamada anth()
obtiene el siguiente argumento en los parámetros de la línea de comandos, sin omitir ninguno.En contraste, en el Enfoque 2, la función
args()
es llamada una vez en la funciónmain()
y el iteradorArgs
resultante se almacena en la variableargs
. Cada llamada anth()
en este iterador devuelve el siguiente argumento, pero también consume el iterador moviendo su posición hacia adelante. Por lo tanto, cuando se llama anth()
con un parámetro de 2, se omite el primer argumento y se obtiene el segundo. Cuando se llama nuevamente con un parámetro de 3, se omite el segundo argumento y se obtiene el tercero. Esto significa que el tercer argumento es en realidad el cuarto argumento en los parámetros de la línea de comandos ynth()
devuelveNone
en lugar del valor esperado, lo que provoca un error cuando se llama aunwrap()
.Para solucionar este problema en el Enfoque 2, puedes almacenar los argumentos de la línea de comandos en variables inmediatamente, de la siguiente manera:
O puedes utilizar el iterador
std::env::args().skip(1)
para omitir el nombre del programa y obtener los argumentos sin consumir el iterador: