如何在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
或format_with
:
use itertools::Itertools;
fn main() {
println!("{}", std::env::args().format(" "));
}
我只想要一个用空格分隔的字符串。
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,你可以在
format!
宏中使用上面的
format
/
format_with
示例。
此外,
join
也是很有用的。
use itertools::Itertools;
fn args() -> String {
std::env::args().join(" ")
}
fn main() {
println!("{}", args());
}
在其他情况下,您可能希望使用intersperse
:
use itertools::Itertools;
fn args() -> String {
std::env::args().intersperse(" ".to_string()).collect()
}
fn main() {
println!("{}", args());
}
请注意,相比其他选择,这种方法效率不高,因为每次迭代都会克隆一个 String
。
itertools
中有一个intersperse
方法。我认为在std
中没有一个简单的方法来做到这一点。请注意,我会尽力使翻译通俗易懂,但不改变原来的意思。 - Dogbertaccum
是否为空。我不确定这是否是有效的Rust语法,但通常我会做类似这样的事情:accum +(如果accum ==“”{“”} else {“ ”})+&s
。 - Ferruccioitertools
方法的任何人,只需注意 - 在itertools
中有一个join
函数,它将所有元素连接成一个由指定分隔符分隔的单个字符串。 - Harvey Adcock.join(" ")
或.format_default(" ")
。 - bluss