Qual é o equivalente do operador de junção sobre um vetor de Strings?

Respostas:

153

No Rust 1.3.0 e posterior, joinestá disponível:

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

Antes de 1.3.0, este método era chamado connect:

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

Observe que você não precisa importar nada, pois os métodos são importados automaticamente pelo prelúdio da biblioteca padrão .

MatthewG
fonte
7
Talvez isso tenha mudado, mas SliceConcatExté apenas noturno.
5
@Evert A característica é marcada como instável, mas seus métodos são estáveis, então você pode usá-los. Você não precisa explicitamente useo traço porque está no prelúdio.
intervalo
1
@shepmaster Se eu ler o seu 'resposta' corretamente, há um joinno itertools.
Steve Powell
2
Obrigado @shepmaster. Infelizmente, sua referência sem adornos a outra resposta foi um tanto enigmática, então não ficou claro qual parte dessa resposta era relevante. Embora seus comentários, correções e respostas sejam invariavelmente excelentes, seu estilo é condescendente e desagradável.
Steve Powell
10

Há uma função da itertoolscaixa também chamada joinque se junta a um iterador:

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
fonte
6
Os usuários desse código devem estar cientes de que ele aloca uma string potencialmente grande apenas para jogá-la fora. É mais eficiente gravar as strings diretamente na saída. Consulte também Qual é a maneira idiomática de imprimir um iterador separado por espaços no Rust? , Em Rust, qual a melhor maneira de imprimir algo entre cada valor em um container? .
Shepmaster
2
Compreensível, embora a questão fosse sobre join, e não sobre as maneiras de otimizar o algoritmo de formatação, não?
Nick Linker
6
collect+ joiné mais rápido e não adiciona dependências, veja esta essência para um benchmark
murlakatamenka