Qual è l'equivalente dell'operatore di unione su un vettore di stringhe?


Risposte:


153

In Rust 1.3.0 e joinversioni successive, è disponibile:

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

Prima della 1.3.0 questo metodo era chiamato connect:

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

Notare che non è necessario importare nulla poiché i metodi vengono importati automaticamente dal preludio della libreria standard .


7
Forse questo è cambiato, ma SliceConcatExtè solo notturno.

5
@Evert Il tratto è contrassegnato come instabile, ma i suoi metodi sono stabili quindi puoi usarli. Non è necessario specificare esplicitamente useil tratto perché è nel preludio.
Interjay


1
@shepmaster Se leggo correttamente la tua 'risposta', c'è un joinin itertools.
Steve Powell

2
Grazie @shepmaster. Sfortunatamente, il tuo semplice riferimento a un'altra risposta era piuttosto criptico, quindi non era affatto chiaro quale parte di quella risposta fosse pertinente. Sebbene i tuoi commenti, le correzioni e le risposte siano sempre eccellenti, il tuo stile è condiscendente e scoraggiante.
Steve Powell


10

C'è anche una funzione della itertoolscassa chiamata joinche si unisce a un iteratore:

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
Gli utenti di questo codice devono essere consapevoli del fatto che alloca una stringa potenzialmente grande solo per buttarla via. È più efficiente scrivere le stringhe direttamente nell'output. Vedi anche Qual è un modo idiomatico per stampare un iteratore separato da spazi in Rust? , In Rust, qual è il modo migliore per stampare qualcosa tra ogni valore in un contenitore? .
Shepmaster

2
Comprensibile, anche se la domanda riguardava il join, non i modi per ottimizzare l'algoritmo di formattazione, no?
Nick Linker

6
collect+ joinè più veloce e non aggiunge dipendenze, guarda questo succo per un benchmark
murlakatamenka
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.