Структура с полем-ссылкой в Rust
Когда структура хранит не копию текста, а ссылку на него, срок жизни поля должен быть виден в типе. Пометку пишут рядом с именем структуры, а поле получает ссылку с тем же именем срока. Так компилятор связывает экземпляр с данными, на которые он смотрит.
Опишем обертку над фрагментом строки:
struct Text<'a> {
raw: &'a str,
}
fn main() {
let source = String::from("book");
let part = Text {
raw: source.as_str(),
};
println!("{}", part.raw);
}
Пока живет source, поле raw
указывает на ее содержимое. Если убрать
пометку у Text, сборка напомнит,
что ссылка в поле требует именованный срок.
Тот же тип можно вернуть из функции, если ссылка внутри не переживает аргумент:
struct Text<'a> {
raw: &'a str,
}
fn wrap<'a>(piece: &'a str) -> Text<'a> {
Text { raw: piece }
}
fn main() {
let word = String::from("rust");
let boxed = wrap(word.as_str());
println!("{}", boxed.raw);
}
Дан текст:
let title = String::from("supreme");
Объявите структуру с одним полем-ссылкой
на строку, создайте значение из title
и выведите поле.
Дано поле:
struct Note {
body: &str,
}
Скажите, чего не хватает в объявлении и как исправить тип, чтобы файл собрался.
Даны строки:
let a = String::from("left");
let b = String::from("right");
Запишите функцию, которая принимает две общие ссылки и возвращает структуру с полем из более длинного фрагмента, и выведите результат.