#rust #lifetime
#Ржавчина #время жизни
Вопрос:
Из книги по языку программирования Rust я дошел до главы о времени жизни. Я не могу понять, почему компилятору Rust так сложно автоматически присваивать аргументам функции наименьшее время жизни переданных параметров.
Пример:
fn main() {
let string1 = String::from("abcd");
let string2 = "xyz";
let result = longest(string1.as_str(), string2);
println!("The longest string is {}", result);
}
fn longest(x: amp;str, y: amp;str) -> amp;str {
if x.len() > y.len() {
x
} else {
y
}
}
Rust будет жаловаться на пожизненные аннотации, и мне придется написать следующее:
fn longest<'a>(x: amp;'a str, y: amp;'a str) -> amp;'a str {...}
Это приведет к предоставлению наименьшего времени жизни. Если Rust может автоматически определять наименьшее время жизни и назначать его 'a
, то зачем мне аннотировать сигнатуру функции вручную?
Другими словами, почему компилятор Rust просто не выбирает наименьшее время жизни, просто просматривая переданные параметры string1
string2
и назначая наименьшее время жизни 'a
?
PS Я предполагаю, что у вас всегда будет одинаковое время жизни (как в этом примере) или один отступ в другом, и в этом случае вам нужно как можно меньше времени жизни, чтобы избежать висячих ссылок.
Комментарии:
1. Вы задали этот вопрос на reddit и получили подробные ответы. Что еще вы ожидаете узнать здесь?
2. @user4815162342 я ответил на них, но ответа не получил, плюс я просто хочу помочь сообществу, задав его здесь
3. Этот вопрос задавался здесь и в прошлом. Надеюсь, ответы разрешат оставшиеся недоразумения. Получайте удовольствие от Rust!
4. @user4815162342 мой вопрос немного отличается, как я объяснил, у меня есть предположение, что вы всегда будете выбирать наименьшее время жизни, я постараюсь повеселиться с Rust, спасибо
5. Это неверное предположение, которое я делаю в целом. Точно так же, как у вас есть пример, в котором вы хотите минимальное из двух времен жизни, есть еще больше примеров, когда это не то, что вы хотите. (например, функция, которая всегда возвращала ссылку, привязанную к
x
, не должна быть ограниченаy
) Разработчики Rust создали правила определения времени жизни таким образом, что аннотации не всегда требуются, но должны быть явно продиктованы пользователем при возникновении двусмысленности.