Davide Aversa
Davide Aversa

Reputation: 5968

What is the equivalent of the join operator over a vector of Strings?

I wasn't able to find the Rust equivalent for the "join" operator over a vector of Strings. 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

Answers (3)

Danilo Bargen
Danilo Bargen

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

MatthewG
MatthewG

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

Nick Linker
Nick Linker

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

Related Questions