Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What's an idiomatic way to print an iterator separated by spaces in Rust?

Tags:

I just want a space separated String of the argument variables obtained from std::env::args(), which I've been creating using the fold function like this:

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

However this creates an extra space at the end which is unwanted. I tried using the truncate function, but truncate doesn't return a String, just modifies the existing String, and also this would require the creation of an intermediate binding in order to use the String's len() call to define how long the truncated String should be (which itself would require an intermediate binding due to Rust's current lexical borrowing rules I believe!)

like image 1000
Harvey Adcock Avatar asked Apr 29 '16 15:04

Harvey Adcock


1 Answers

What's an idiomatic way to print all command line arguments in Rust?

fn main() {     let mut args = std::env::args();      if let Some(arg) = args.next() {         print!("{}", arg);          for arg in args {             print!(" {}", arg);         }     } } 

Or better with Itertools' format or format_with:

use itertools::Itertools; // 0.8.0  fn main() {     println!("{}", std::env::args().format(" ")); } 

I just want a space separated 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()); } 

Or

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

If you use Itertools, you can use the format / format_with examples above with the format! macro.

join is also useful:

use itertools::Itertools; // 0.8.0  fn args() -> String {     std::env::args().join(" ") }  fn main() {     println!("{}", args()); } 

In other cases, you may want to use intersperse:

use itertools::Itertools; // 0.8.0  fn args() -> String {     std::env::args().intersperse(" ".to_string()).collect() }  fn main() {     println!("{}", args()); } 

Note this isn't as efficient as other choices as a String is cloned for each iteration.

like image 62
Shepmaster Avatar answered Sep 29 '22 08:09

Shepmaster