Was ist das Äquivalent des Join-Operators über einen Vektor von Strings?

119

Ich konnte das Rust-Äquivalent für den Operator "join" über einen Vektor von Strings nicht finden. Ich habe eine Vec<String>und möchte mich ihnen als Single anschließen String:

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

Verbunden:

Davide Aversa
quelle

Antworten:

151

In Rust 1.3.0 und höher joinist verfügbar:

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

Vor 1.3.0 wurde diese Methode aufgerufen connect:

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

Beachten Sie, dass Sie nichts importieren müssen, da die Methoden vom Standardbibliotheksvorspiel automatisch importiert werden .

MatthewG
quelle
7
Vielleicht hat sich dies geändert, ist aber SliceConcatExtnur nachts.
5
@Evert Das Merkmal ist als instabil markiert, aber seine Methoden sind stabil, sodass Sie sie verwenden können. Sie müssen usedas Merkmal nicht explizit angeben, da es sich im Vorspiel befindet.
Interjay
1
@shepmaster Wenn ich Ihre 'Antwort' richtig gelesen habe, gibt es ein joinin itertools.
Steve Powell
2
Danke @shepmaster. Leider war Ihr schmuckloser Verweis auf eine andere Antwort ziemlich kryptisch, sodass überhaupt nicht klar war, welcher Teil dieser Antwort relevant war. Obwohl Ihre Kommentare, Korrekturen und Antworten ausnahmslos hervorragend sind, ist Ihr Stil herablassend und abstoßend.
Steve Powell
10

Es gibt eine Funktion aus der itertoolsKiste, die auch aufgerufen wird joinund einen Iterator verbindet:

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
quelle
6
Benutzer dieses Codes sollten sich bewusst sein, dass er eine potenziell große Zeichenfolge zuweist, um sie wegzuwerfen. Es ist effizienter, die Zeichenfolgen direkt in die Ausgabe zu schreiben. Siehe auch Was ist eine idiomatische Methode, um einen durch Leerzeichen in Rust getrennten Iterator zu drucken? , In Rust, was ist der beste Weg , um etwas zwischen jedem Wert in einem Behälter drucken? .
Shepmaster
2
Verständlich, obwohl es um die Frage ging join, wie der Formatierungsalgorithmus nicht optimiert werden kann, nein?
Nick Linker
6
collect+ joinist schneller und fügt keine Abhängigkeiten hinzu, siehe diesen Kern für einen Benchmark
murlakatamenka