Apa yang setara dengan operator gabungan pada vektor String?

120

Saya tidak dapat menemukan padanan Rust untuk operator "join" melalui vektor Strings. Saya punya Vec<String>dan saya ingin bergabung dengan mereka sebagai single String:

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

Terkait:

Davide Aversa
sumber

Jawaban:

153

Di Rust 1.3.0 dan yang lebih baru, jointersedia:

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

Sebelum 1.3.0 metode ini disebut connect:

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

Perhatikan bahwa Anda tidak perlu mengimpor apa pun karena metode secara otomatis diimpor oleh pustaka standar pendahuluan .

MatthewG
sumber
7
Mungkin ini telah berubah, tetapi SliceConcatExthanya untuk malam hari.
5
@Evert Ciri ini ditandai tidak stabil, tetapi metodenya stabil sehingga Anda dapat menggunakannya. Anda tidak perlu usemenunjukkan sifat tersebut secara eksplisit karena ini adalah pendahuluan.
interjay
1
@shepmaster Jika saya membaca 'balasan' Anda dengan benar, berarti ada joindi itertools.
Steve Powell
2
Terima kasih @shepmaster. Sayangnya, referensi sederhana Anda ke jawaban lain agak samar, jadi sama sekali tidak jelas bagian mana dari jawaban itu yang relevan. Meskipun komentar, koreksi, dan jawaban Anda selalu luar biasa, gaya Anda merendahkan dan tidak menyenangkan.
Steve Powell
24

Seperti yang disebutkan oleh Wilfred, SliceConcatExt::connecttidak digunakan lagi sejak versi 1.3.0 untuk mendukung SliceConcatExt::join:

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

Ada fungsi dari itertoolspeti yang juga disebut joinyang bergabung dengan 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)
}
Nick Linker
sumber
6
Pengguna kode ini harus menyadari bahwa ia mengalokasikan string yang berpotensi besar hanya untuk membuangnya. Lebih efisien jika menulis string langsung ke keluaran. Lihat juga Apa cara idiomatik untuk mencetak iterator yang dipisahkan oleh spasi di Rust? , Di Rust, apa cara terbaik untuk mencetak sesuatu di antara setiap nilai dalam sebuah wadah? .
Shepmaster
2
Bisa dimaklumi, meskipun pertanyaannya tentang join, bukan bagaimana cara mengoptimalkan algoritma format, bukan?
Nick Linker
6
collect+ joinlebih cepat dan tidak menambahkan ketergantungan, lihat inti ini untuk patokan
murlakatamenka