web-dev-qa-db-fra.com

Quel est l'équivalent de l'opérateur de jointure sur un vecteur de chaînes?

Je n'ai pas pu trouver l'équivalent de Rust pour l'opérateur "join" sur un vecteur de Strings. J'ai un Vec<String> et j'aimerais les rejoindre en tant que simple String:

let string_list = vec!["Foo".to_string(),"Bar".to_string()];
let joined = something::join(string_list,"-");
assert_eq!("Foo-Bar", joined);
68
Davide Aversa

Dans Rust 1.3.0 et versions ultérieures, SliceConcatExt::join est disponible:

fn main() {
    let string_list = vec!["Foo".to_string(),"Bar".to_string()];
    let joined = string_list.join("-");
    assert_eq!("Foo-Bar", joined);
}

Avant la version 1.3.0, vous pouvez utiliser SliceConcatExt::connect :

let joined = string_list.connect("-");

Notez que vous n'avez besoin d'aucune importation car les méthodes sont automatiquement importées par la bibliothèque standard prélude .

87
MatthewG

Comme mentionné par Wilfred, SliceConcatExt::connect est obsolète depuis la version 1.3.0 au profit de SliceConcatExt::join :

let joined = string_list.join("-");
21
Danilo Bargen

Il existe une fonction de itertools crate également appelée join qui rejoint un itérateur:

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)
}
1
Nick Linker