Почему Rust не может автоматически указывать наименьшее время жизни параметров?

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