在不修改 args 的情况下采用第一个参数的简洁方法

Clean way of taking first argument without modifiying args

这个程序应该像这样接受参数:<command> n1 n2 n3... 例如 mode 1 2 3 3 4。我想存储 <command> 参数字符串并将其余参数传递给构造函数进行解析。

fn main() {
    let args = args();

    let command = args.skip(1).next().unwrap_or_else(|| {
        eprintln!("Command not found; expected one of \"mode\", \"mean\", \"median\" \"range\"");
        process::exit(1);
    });

    let set = DataSet::from_args(args).unwrap_or_else(|err| {
        eprintln!("error parsing values: {}", err);
        process::exit(1);
    });

    match command.to_lowercase().trim() {
        "mode" => println!("{:?}", set.mode()),
        _ => eprintln!("Command not recognised: \"{}\"", command),
    }
}

此代码不起作用,因为 args.skip(1).next()... 通过将其改编为 Skip 来消耗 args,因此当我尝试调用 DataSet::from_args(args) 时它无效,因为它已搬入 skip.

实现此目标的最佳方法是什么?我听说 itertools 库可以为 Args 提供 nth 方法,但我更愿意在没有的情况下这样做。

首先,std has nth() method:您可以使用nth(1)代替skip(1).next()

其次,Iterator is implemented for &mut Iterator. So you can just call skip() on &mut args. There is even a method for that: by_ref()

    let command = args.by_ref().skip(1).next().unwrap_or_else(|| {
        eprintln!("Command not found; expected one of \"mode\", \"mean\", \"median\" \"range\"");
        process::exit(1);
    });