У меня склад ума, поддерживающий мои String
неизменные, единый источник истины. По мере того же подхода к Rust я обнаруживаю, что мне нужно много клонировать. Поскольку String
не меняются, все клонирование не требуется. Ниже приведен пример этого и ссылка на соответствующую игровую площадку .
Заимствование не представляется возможным, так как мне пришлось бы иметь дело со ссылками и их временем жизни. Моя следующая мысль - использовать что-то вроде Rc
или Cow
struct. Но оборачивать все String
чем-то вроде Rc
кажется неестественным. В своем ограниченном опыте работы с Rust я никогда не видел никаких открытых структур владения / управления памятью, то есть Rc
и Cow
. Мне любопытно, как опытный разработчик Rust мог бы справиться с такой проблемой.
На самом ли деле в Rust можно представить структуры управления собственностью / памятью, такие как Rc
и Cow
? Должен ли я использовать ломтики?
use std::collections::HashSet;
#[derive(Debug)]
enum Check {
Known(String),
Duplicate(String),
Missing(String),
Unknown(String)
}
fn main() {
let known_values: HashSet<_> = [
"a".to_string(),
"b".to_string(),
"c".to_string()]
.iter().cloned().collect();
let provided_values = vec![
"a".to_string(),
"b".to_string(),
"z".to_string(),
"b".to_string()
];
let mut found = HashSet::new();
let mut check_values: Vec<_> = provided_values.iter().cloned()
.map(|v| {
if known_values.contains(&v) {
if found.contains(&v) {
Check::Duplicate(v)
} else {
found.insert(v.clone());
Check::Known(v)
}
} else {
Check::Unknown(v)
}
}).collect();
let missing = known_values.difference(&found);
check_values = missing
.cloned()
.fold(check_values, |mut cv, m| {
cv.push(Check::Missing(m));
cv
});
println!("check_values: {:#?}", check_values);
}