Что эквивалентно оператору соединения над вектором строк?

120

Мне не удалось найти в Rust эквивалент оператора «соединения» над вектором Strings. У меня есть Vec<String>и я хотел бы присоединиться к ним как сингл String:

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

Связанный:

Давиде Аверса
источник

Ответы:

153

В Rust 1.3.0 и новее joinдоступно:

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 этот метод назывался connect:

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

Обратите внимание, что вам не нужно ничего импортировать, поскольку методы автоматически импортируются прелюдией стандартной библиотеки .

MatthewG
источник
7
Возможно, это изменилось, но SliceConcatExtработает только по ночам.
5
@Evert Признак помечен как нестабильный, но его методы стабильны, поэтому вы можете их использовать. Вам не нужно явно useуказывать черту, потому что она находится в прелюдии.
Interjay
1
@shepmaster Если я правильно прочитал ваш «ответ», значит, есть joinin itertools.
Стив Пауэлл
2
Спасибо @shepmaster. К сожалению, ваша неприукрашенная ссылка на другой ответ была довольно загадочной, поэтому было не совсем ясно, какая часть этого ответа имеет отношение к делу. Хотя ваши комментарии, исправления и ответы неизменно превосходны, ваш стиль снисходительный и отталкивающий.
Стив Пауэлл
10

Также из itertoolsящика вызывается функция, 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
Пользователи этого кода должны знать, что он выделяет потенциально большую строку только для того, чтобы выбросить ее. Более эффективно записывать строки прямо на вывод. См. Также Какой идиоматический способ распечатать итератор, разделенный пробелами в Rust? , Как лучше всего печатать что-либо между каждым значением в контейнере в Rust? .
Shepmaster 05
2
Понятно, хотя вопрос был о том join, а не о способах оптимизации алгоритма форматирования, нет?
Ник Линкер
6
collect+ joinработает быстрее и не добавляет зависимостей, посмотрите эту суть для теста
murlakatamenka