Jaki jest odpowiednik operatora łączenia na wektorze ciągów?

Odpowiedzi:

153

W Rust 1.3.0 i nowszych joinwersjach jest dostępny:

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

Przed 1.3.0 ta metoda była nazywana connect:

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

Zauważ, że nie musisz niczego importować, ponieważ metody są automatycznie importowane przez wstępną bibliotekę standardową .

MatthewG
źródło
7
Być może to się zmieniło, ale SliceConcatExtdotyczy tylko nocy.
5
@Evert Cecha jest oznaczona jako niestabilna, ale jej metody są stabilne, więc możesz ich używać. Nie musisz wyraźnie useokreślać cechy, ponieważ jest ona w preludium.
interjay
1
@shepmaster Jeśli czytam swoją odpowiedź „” prawidłowo, nie ma joinw itertools.
Steve Powell
2
Dziękuję @shepmaster. Niestety, twoje pozbawione ozdób odniesienie do innej odpowiedzi było raczej zagadkowe, więc nie było wcale jasne, która część odpowiedzi jest istotna. Chociaż Twoje komentarze, poprawki i odpowiedzi są niezmiennie doskonałe, Twój styl jest protekcjonalny i odpychający.
Steve Powell
10

Ze itertoolsskrzynki jest również nazywana funkcja, joinktóra łączy się z iteratorem:

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)
}
Nick Linker
źródło
6
Użytkownicy tego kodu powinni być świadomi, że alokuje on potencjalnie duży ciąg, aby go wyrzucić. Bardziej wydajne jest zapisywanie łańcuchów bezpośrednio na wyjściu. Zobacz także Jaki jest idiomatyczny sposób drukowania iteratora oddzielonego spacjami w Rust? , Jaki jest najlepszy sposób drukowania czegoś pomiędzy każdą wartością w kontenerze w Rust? .
Shepmaster,
2
Zrozumiałe, chociaż pytanie dotyczyło join, a nie sposobów optymalizacji algorytmu formatowania, nie?
Nick Linker,
6
collect+ joinjest szybszy i nie dodaje żadnych zależności, zobacz tę istotę dla testu porównawczego
murlakatamenka