#arrays #rust #slice
#массивы #Ржавчина #фрагмент
Вопрос:
У меня есть вектор объектов / экземпляров (не уверен, что такое язык rust), в котором есть поле, содержащее фрагмент строки. Мне нужно создать фрагмент массива, содержащий поля фрагмента строки. Ниже приведена моя попытка. Я пытаюсь стать foo_bars
таким же, как what_i_want
.
struct Foo<'a> {
bar: amp;'a str,
}
let foos = vec![Foo { bar: "one" }, Foo { bar: "two" }, Foo { bar: "three" }];
let foo_bars: Vec<str> = foos.into_iter().map(|foo| foo.bar).collect();
let what_i_want = amp;["one", "two", "three"];
Ответ №1:
Вам не хватает amp;
in Vec<amp;str>
.
Вот игровая площадка, которая работает.
struct Foo<'a> {
bar: amp;'a str,
}
fn main() {
let foos = vec![Foo { bar: "one" }, Foo { bar: "two" }, Foo { bar: "three" }];
let foo_bars: Vec<amp;str> = foos.into_iter().map(|foo| foo.bar).collect();
let what_i_want = amp;["one", "two", "three"];
println!("{:?}", foo_bars == what_i_want);
}
Ответ №2:
Все должно иметь фиксированный размер, str
означать диапазон символов в строке, а размер фрагмента строки может быть очень.
Вам нужно использовать указатель amp;
. Указатель имеет фиксированный размер ( usize
). Зависит от архитектуры процессора (32 или 64) бит.
let foo_bars: Vec< str> = foos.into_iter().map(|foo| foo.bar).collect();
^ add a `amp;` here
Комментарии:
1. Ссылка на
str
фактически имеет двойной размер, указатель на начало и ausize
длины.