Вывод пометки компилятором в 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 }
Скажите, для какой из них компилятор обычно выводит пометку сам, а для какой скорее потребует явную запись.