Получить фрагмент массива str из вектора объектов, содержащих str

#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 фактически имеет двойной размер, указатель на начало и a usize длины.