Можно просто использовать срезы (slice):
#[derive(Debug)]
struct CarInfo<'a> {
name: &'a str,
model: &'a str,
}
fn main() {
let input = ["vaz:2107", "gaz:3102"];
let output: Vec<CarInfo> = input
.iter()
.map(|s| s.split_at(s.find(':').expect("Can't find ':'")))
.map(|(name, model)| CarInfo { name, model: &model[1..] })
.collect();
dbg!(output);
}
(
песочница)
Вывод:
Compiling playground v0.0.1 (/playground)
Finished dev [unoptimized + debuginfo] target(s) in 1.56s
Running `target/debug/playground`
[src/main.rs:14] output = [
CarInfo {
name: "vaz",
model: "2107",
},
CarInfo {
name: "gaz",
model: "3102",
},
]
Важный момент, который надо учитывать: в такой реализации структура не может пережить данные, на которые ссылаются ее поля.