Я пытался разобраться в модели заимствования и владения Rust.
Предположим, у нас есть следующий код:
fn main() {
let a = String::from("short");
{
let b = String::from("a long long long string");
println!("{}", min(&a, &b));
}
}
fn min<'a>(a: &'a str, b: &'a str) -> &'a str {
if a.len() < b.len() {
return a;
} else {
return b;
}
}
min()
просто возвращает ссылку на более короткую из двух упомянутых строк. main()
передает две строковые ссылки, ссылки на которые определены в разных областях. Я использовал String::from()
, чтобы ссылки не имели статического времени жизни. Программа правильно печатает short
. Вот пример из Rust Playground.
Если мы обратимся к Rustonomicon (который, я ценю, находится в стадии разработки) , нам говорят, что значение сигнатуры функции, например:
fn as_str<'a>(data: &'a u32) -> &'a str
означает функцию:
берет ссылку на
u32
с некоторым временем жизни и обещает, что может создать ссылку наstr
, который может жить так же долго.
Теперь обратимся к подписи min()
из моего примера:
fn min<'a>(a: &'a str, b: &'a str) -> &'a str
Это более популярно, поскольку:
- У нас есть две входные ссылки.
- Их референты определены в разных областях, что означает, что они действительны для разных сроков жизни (
a
действительно дольше).
Используя формулировку, аналогичную приведенной выше цитате, что означает сигнатура функции min()
?
Функция принимает две ссылки и обещает создать ссылку на
str
, которая может существовать до тех пор, пока референтыa
иb
? Это почему-то кажется неправильным, как будто мы возвращаем ссылка наb
изmin()
, тогда ясно, что эта ссылка недействительна в течение срока жизниa
вmain()
.Функция принимает две ссылки и обещает создать ссылку на
str
, который может существовать до тех пор, пока короче из двух референтовa
иb
? Это может сработать, поскольку оба референтаa
иb
остаются действительными во внутренней областиmain()
.Что-то совсем другое?
Подводя итог, я не понимаю, что значит привязать время жизни двух входных ссылок min()
к одному и тому же времени жизни, когда их референты определены в разных областях в вызывающей стороне.