Собирает ли третье правило жизненного права все случаи для реализаций структуры?
Третье правило пожизненного избрания говорит
Если есть несколько входных параметров времени жизни, но один из них
&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.
Смотрите также: