Собирает ли третье правило жизненного права все случаи для реализаций структуры?

Третье правило пожизненного избрания говорит

Если есть несколько входных параметров времени жизни, но один из них &self или же &mut self потому что это метод, то время жизни self присваивается всем выходным параметрам времени жизни. Это делает методы письма намного приятнее.

Вот учебник, описывающий, что случилось с этой функцией

fn announce_and_return_part(&self, announcement: &str) -> &str

Существует два времени жизни входа, поэтому Rust применяет первое правило жизни и дает оба &self а также announcement их собственные жизни. Тогда, потому что один из параметров &selfвозвращаемый тип получает время жизни &selfи все жизни были учтены.

Мы можем показать, что все жизни не учитываются, так как возможно, что announcement будет иметь другой срок службы, чем &self:

struct ImportantExcerpt<'a> {
    part: &'a str,
}

impl<'a> ImportantExcerpt<'a> {
    fn announce_and_return_part(&self, announcement: &str) -> &str {
        println!("Attention please: {}", announcement);
        announcement
    }
}

fn main() {
    let i = ImportantExcerpt { part: "IAOJSDI" };
    let test_string_lifetime;

    {
        let a = String::from("xyz");
        test_string_lifetime = i.announce_and_return_part(a.as_str());
    }
    println!("{:?}", test_string_lifetime);   
}

Время жизни announcement не так долго, как &selfпоэтому некорректно связывать время выхода с &selfне следует ли связать время жизни с более длинным входом?

Почему третье правило жизненного цикла является допустимым способом назначения выходного времени?

1 ответ

Решение

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

Цитирую из документации, на которую вы ссылались, выделение мое:

Шаблоны, запрограммированные в анализе ссылок Rust, называются правилами выбора времени жизни. Это не правила, которым должны следовать программисты; правила представляют собой набор частных случаев, которые будет учитывать компилятор, и если ваш код соответствует этим случаям, вам не нужно явно указывать время жизни.

Правила elision не обеспечивают полного вывода: если Rust детерминистически применяет правила, но все еще остается двусмысленность относительно того, какое время жизни имеют ссылки, оно не будет угадывать, каким должно быть время жизни оставшихся ссылок. В этом случае компилятор выдаст вам ошибку, которую можно исправить, добавив аннотации времени жизни, соответствующие вашим намерениям относительно того, как ссылки связаны друг с другом.


Время жизни announcement не так долго, как &selfпоэтому некорректно связывать время выхода с &self

Почему третье правило жизненного цикла является допустимым способом назначения выходного времени?

"правильный", вероятно, не то слово, которое следует использовать здесь. То, что сделали правила elision, - это верный способ, просто не так, как вы хотели.

Разве время жизни выхода не должно быть связано с большей длиной входа?

Да, это было бы приемлемо для этого примера, просто это не самый распространенный случай, так что это не то, на что были нацелены правила elision.

Смотрите также:

Другие вопросы по тегам