Який еквівалент оператора з'єднання над вектором Strings?


120

Мені не вдалося знайти еквівалент іржі для оператора "приєднання" через вектор 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

У версії 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("-");

Зауважте, що вам не потрібно нічого імпортувати, оскільки методи автоматично імпортуються стандартною прелюдією бібліотеки .


7
Можливо, це змінилося, але SliceConcatExtлише вночі.

5
@Evert Ця ознака позначена нестабільною, але її методи стабільні, тому ви можете їх використовувати. Не потрібно чітко useознакувати, оскільки це в прелюдії.
interjay


1
@shepmaster Якщо я прочитав ваш «відповідь» правильно, є joinв 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, який найкращий спосіб надрукувати щось між кожним значенням у контейнері? .
Шепмайстер

2
Зрозуміло, хоча питання стосувалося join, а не способів оптимізації алгоритму форматування, ні?
Нік Лінкер

6
collect+ joinшвидше і не додає залежностей, дивіться цю суть для орієнтиру
murlakatamenka
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.