¿Cuál es el equivalente del operador de combinación sobre un vector de cadenas?


120

No pude encontrar el equivalente de Rust para el operador "join" sobre un vector de Strings. tengo unVec<String> y me gustaría unirme a ellos como soltero String:

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

Relacionado:

Respuestas:


153

En Rust 1.3.0 y posteriores, joinestá disponible:

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

Antes de la 1.3.0 se llamaba a este método connect:

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

Tenga en cuenta que no necesita importar nada, ya que el preludio de la biblioteca estándar importa automáticamente los métodos .


7
Quizás esto haya cambiado, pero SliceConcatExtes solo por la noche.

5
@Evert El rasgo está marcado como inestable, pero sus métodos son estables para que puedas usarlos. No es necesario especificar explícitamente useel rasgo porque está en el preludio.
interjay


1
@shepmaster Si leo su 'respuesta' correctamente, hay un joinin itertools.
Steve Powell

2
Gracias @shepmaster. Desafortunadamente, su referencia sin adornos a otra respuesta fue bastante críptica, por lo que no estaba del todo claro qué parte de esa respuesta era relevante. Aunque sus comentarios, correcciones y respuestas son invariablemente excelentes, su estilo es condescendiente y desagradable.
Steve Powell


10

Hay una función de la itertoolscaja también llamada joinque se une a un 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)
}

6
Los usuarios de este código deben ser conscientes de que asigna una cadena potencialmente grande solo para desecharla. Es más eficiente escribir las cadenas directamente en la salida. Consulte también ¿Cuál es una forma idiomática de imprimir un iterador separado por espacios en Rust? , En Rust, ¿cuál es la mejor manera de imprimir algo entre cada valor en un contenedor? .
Shepmaster

2
Es comprensible, aunque la pregunta era sobre el join, no sobre las formas de optimizar el algoritmo de formato, ¿no?
Nick Linker

6
collect+ joines más rápido y no agrega dependencias, vea esta esencia para un punto de referencia
murlakatamenka
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.