В главе 19.2 документа Язык программирования Rust следующий пример компилируется без ошибок. Я узнал из выпуск № 1834, что существует новое правило исключения на всю жизнь, которое неявно делает 's
длиннее 'c
.
Хотя мне не удалось найти подробного объяснения этого нового правила исключения, я полагаю, что это не более чем просто неявная версия более длинного и более явного ограничения: <'c, 's: 'c>
. Однако я думаю, что мое замешательство, вероятно, не в этом новом правиле исключения, но, конечно, я могу ошибаться в этом.
Насколько я понимаю, parse_context
становится владельцем context
, поскольку он не был заимствован, а фактически перемещен в функцию. Одно это для меня означает, что время жизни context
должно соответствовать времени жизни функции, которой он принадлежит, независимо от времени жизни и ограничений, которые мы определили в Context
и Parser
.
Основываясь на этих определениях, часть, где context
переживает временное Parser
, имеет для меня смысл (в конце концов, мы определили более длительный срок службы), но часть, где ссылка &str
не удаляется, когда context
выходит за пределы области в конце parse_context
и я все еще могу его смело вернуть - меня озадачивает.
Что я пропустил? Как компилятор может определить время жизни возвращенного &str
?
ОБНОВЛЕННЫЙ ПРИМЕР
struct Context<'s>(&'s str);
struct Parser<'c, 's>
{
context: &'c Context<'s>,
}
impl<'c, 's> Parser<'c, 's>
{
fn parse(&self) -> Result<(), &'s str>
{
Err(self.context.0)
}
}
fn parse_context(context: Context) -> Result<(), &str>
{
Parser { context: &context }.parse()
}
fn main()
{
let mut s = String::new();
s += "Avail";
s += "able?";
if let Err(text) = parse_context(Context(&s))
{
println!("{}", text);
}
}