es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Enfoque 1 y Enfoque 2 son diferentes en cuanto a cómo manejan el iterador Args. En el Enfoque 1, la función args() es llamada dentro de la función get_nth_arg() y devuelve un nuevo iterador Args en cada llamada. Esto significa que cada llamada a nth() 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ón main() y el iterador Args resultante se almacena en la variable args. Cada llamada a nth() 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 a nth() 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 y nth() devuelve None en lugar del valor esperado, lo que provoca un error cuando se llama a unwrap().

    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:

    let arg1 = args.nth(1).unwrap();
    let arg2 = args.nth(0).unwrap();
    let arg3 = args.nth(0).unwrap();
    

    O puedes utilizar el iterador std::env::args().skip(1) para omitir el nombre del programa y obtener los argumentos sin consumir el iterador:

    let mut args = args().skip(1);
    let arg1 = args.next().unwrap();
    let arg2 = args.next().unwrap();
    let arg3 = args.next().unwrap();
    

Comments are closed.