Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗rsSpLfEl 31 of 288 menu
◀ ▶

Вывод пометки компилятором в Rust

В простых сигнатурах компилятор сам догадывается, какой срок связать с ссылками. Такой прием называют элизией: запись в типах сокращают, а правило остается тем же, что и при явной пометке. Это не отмена проверки, а сокращение записи.

Частый случай - одна общая ссылка на строку и результат, который указывает внутрь нее. Напишем функцию, которая берет первый символ текста в кодировке ASCII, где граница байта совпадает с символом:

fn first(text: &str) -> &str { &text[0..1] } fn main() { let word = String::from("go"); let ch = first(word.as_str()); println!("{}", ch); }

Здесь в сигнатуре нет угловых скобок, но компилятор считает, что результат живет не дольше text. На экране буква "g". Для не-ASCII текста такой срез нужно строить иначе; здесь важен именно короткий ASCII-пример.

Если входных ссылок несколько или правило сложнее, элизия может не сработать, и пометку придется указать вручную, как в уроке про явную запись:

fn pick<'a>(a: &'a str, b: &'a str) -> &'a str { if a.len() >= b.len() { a } else { b } } fn main() { let s1 = String::from("a"); let s2 = String::from("bb"); let out = pick(s1.as_str(), s2.as_str()); println!("{}", out); }

Дана строка:

let line = String::from("rust");

Запишите функцию с одной общей ссылкой, которая возвращает последний байт ASCII как подстроку длиной один, и выведите результат для line.

Дана сигнатура:

fn mid(text: &str) -> &str;

Реализуйте тело, которое отдает средний символ однобайтового ASCII-слова длиной три, например для "cat", и выведите результат.

Даны две функции:

fn one(s: &str) -> &str { s } fn two(a: &str, b: &str) -> &str { a }

Скажите, для какой из них компилятор обычно выводит пометку сам, а для какой скорее потребует явную запись.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить