Reputation: 5968
I wasn't able to find the Rust equivalent for the "join" operator over a vector of String
s. I have a Vec<String>
and I'd like to join them as a single String
:
let string_list = vec!["Foo".to_string(),"Bar".to_string()];
let joined = something::join(string_list,"-");
assert_eq!("Foo-Bar", joined);
Related:
Upvotes: 296
Views: 245677
Reputation: 19432
As mentioned by Wilfred, slice::connect
has been deprecated since version 1.3.0 in favour of slice::join
:
let joined = string_list.join("-");
Upvotes: 35
Reputation: 9283
In Rust 1.3.0 and later, join
is available:
fn main() {
let string_list = vec!["Foo".to_string(),"Bar".to_string()];
let joined = string_list.join("-");
assert_eq!("Foo-Bar", joined);
}
Before 1.3.0 this method was called connect
:
let joined = string_list.connect("-");
Note that you do not need to import anything since the methods are automatically imported by the standard library prelude.
join
copies elements of the vector, it does not move them, thus it preserves the contents of the vector, rather than destroying it.
Upvotes: 398
Reputation: 1043
There is a function from the itertools
crate also called join
which joins an iterator:
extern crate itertools; // 0.7.8
use itertools::free::join;
use std::fmt;
pub struct MyScores {
scores: Vec<i16>,
}
impl fmt::Display for MyScores {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
fmt.write_str("MyScores(")?;
fmt.write_str(&join(&self.scores[..], &","))?;
fmt.write_str(")")?;
Ok(())
}
}
fn main() {
let my_scores = MyScores {
scores: vec![12, 23, 34, 45],
};
println!("{}", my_scores); // outputs MyScores(12,23,34,45)
}
Upvotes: 17