Bir Dizeler vektörü üzerindeki birleştirme operatörünün eşdeğeri nedir?


120

Bir Strings vektörü üzerinden "birleştirme" operatörü için Rust eşdeğerini bulamadım . A sahibim Vec<String>ve onlara bekar olarak katılmak istiyorum String:

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

İlişkili:

Yanıtlar:


153

Rust 1.3.0 ve sonraki sürümlerde joinşu olanaklar mevcuttur:

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

1.3.0'dan önce bu yöntem şu şekilde adlandırılıyordu connect:

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

Yöntemler standart kitaplık başlangıcı tarafından otomatik olarak içe aktarıldığından herhangi bir şey içe aktarmanıza gerek olmadığını unutmayın .


7
Belki de bu değişmiştir, ancak SliceConcatExtyalnızca geceliktir.

5
@Evert Özellik kararsız olarak işaretlenmiştir, ancak yöntemleri kararlıdır, böylece onları kullanabilirsiniz. useÖzelliğin başlangıcında olduğu için açıkça özelliğe ihtiyacınız yok .
interjay


1
@shepmaster 'Cevabınızı' doğru okursam, bir joingiriş var itertools.
Steve Powell

2
Teşekkür ederim @shepmaster. Ne yazık ki, başka bir cevaba yapılan süssüz referansınız oldukça gizemliydi, bu yüzden bu cevabın hangi kısmının alakalı olduğu hiç de net değildi. Yorumlarınız, düzeltmeleriniz ve cevaplarınız her zaman mükemmel olsa da tarzınız küçümseyici ve itici.
Steve Powell


10

Bir yineleyiciye katılan itertoolskasadan bir işlev de var join:

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)
}

6
Bu kodun kullanıcıları, onu atmak için potansiyel olarak büyük bir dizge ayırdığının farkında olmalıdır. Dizeleri doğrudan çıktıya yazmak daha verimlidir. Ayrıca bkz Rust boşluklarla ayrılmış bir yineleyici yazdırmak için deyimsel yolu nedir? , Rust'ta, bir kaptaki her değer arasında bir şey yazdırmanın en iyi yolu nedir? .
Shepmaster

2
Anlaşılabilir, ancak soru joinbiçimlendirme algoritmasının nasıl optimize edileceğiyle ilgili değil, değil mi?
Nick Linker

6
collect+ joindaha hızlı ve hiçbir bağımlılık eklemiyor, kıyaslama için bu özü görün
murlakatamenka
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.