什么是在Rust中打印由空格分隔的迭代器的惯用方法?

问题描述 投票:5回答:2

我只想要从String获得的参数变量的空格分隔std::env::args(),我一直使用fold函数创建这样的:

std::env::args()
    .fold("".to_string(), |accum, s| accum + &s + " ")

然而,这在末端创造了额外的空间,这是不希望的。我尝试使用truncate函数,但truncate不返回String,只修改现有的String,这也需要创建一个中间绑定,以便使用Stringlen()调用来定义截断的String应该多长时间(由于Rust目前的词汇借用规则,我自己需要中间约束!)

rust
2个回答
7
投票

在Rust中打印所有命令行参数的惯用方法是什么?

fn main() {
    let mut args = std::env::args();

    if let Some(arg) = args.next() {
        print!("{}", arg);

        for arg in args {
            print!(" {}", arg);
        }
    }
}

或者更好的Itertools'format

use itertools::Itertools; // 0.8.0

fn main() {
    println!("{}", std::env::args().format(" "));
}

我只想要一个空间分隔的String

fn args() -> String {
    let mut result = String::new();
    let mut args = std::env::args();

    if let Some(arg) = args.next() {
        result.push_str(&arg);

        for arg in args {
            result.push(' ');
            result.push_str(&arg);
        }
    }

    result
}

fn main() {
    println!("{}", args());
}

要么

fn args() -> String {
    let mut result = std::env::args().fold(String::new(), |s, arg| s + &arg + " ");
    result.pop();
    result
}

fn main() {
    println!("{}", args());
}

如果你使用Itertools,join很有用:

use itertools::Itertools; // 0.8.0

fn args() -> String {
    std::env::args().join(" ")
}

fn main() {
    println!("{}", args());
}

在其他情况下,您可能想要使用intersperse

use itertools::Itertools; // 0.8.0

fn args() -> String {
    std::env::args().intersperse(" ".to_string()).collect()
}

fn main() {
    println!("{}", args());
}

请注意,这不像其他选择那样有效,因为每次迭代都会克隆String


0
投票

这是一个替代方案

我只想要从String获得的参数变量的空格分隔std::env::args()

fn args_string() -> String {
    let mut out = String::new();
    let mut sep = "";
    for arg in std::env::args() {
        out.push_str(sep);
        out.push_str(&*arg);
        sep = " ";
    }
    out
}

pub fn main() {
    println!("{}", args_string());
}
© www.soinside.com 2019 - 2024. All rights reserved.