struct Context<'s>(&'s str);
→ Значения типа Context
содержат строку с некоторым временем жизни 's
.Это время жизни неявно не меньше, чем время жизни контекста, но оно может быть длиннее.
struct Parser<'c, 's>
{
context: &'c Context<'s>,
}
→ Значения типа Parser
содержат ссылку на контекст с некоторым временем жизни 'c
.Этот контекст содержит строку с некоторым прочим временем жизни 's
.
impl<'c, 's> Parser<'c, 's>
{
fn parse(&self) -> Result<(), &'s str>
{
Err(self.context.0)
}
}
→ Функция parse
возвращает значение с временем жизни 's
, т.е.с тем же временем жизни, что и строкой, которая хранится внутри контекста, , которая не совпадает с временем жизни самого контекста.
fn parse_context(context: Context) -> Result<(), &str>
{
Parser { context: &context }.parse()
}
→ Я не уверен, где именноэто указано, но, очевидно, компилятор делает вывод, что время жизни возвращаемой строки совпадает с параметром 's
, используемым для контекста.Обратите внимание, что даже если сам контекст перемещен в parse_context
, это влияет только на сам контекст, а не на содержащуюся в нем строку.
fn main()
{
let mut s = String::new();
→ Создать новую строку, действительную до конца main
s += "Avail";
s += "able?";
if let Err(text) = parse_context(Context(&s))
→ Создать новый контекст и переместить его в parse_context
.Он будет автоматически отброшен в конце parse_context
.Он содержит ссылку на строку s
, которая действительна до конца main
, а parse_context
возвращает строку с тем же временем жизни, что и s
⇒ text
, действительная до конца main
.
{
println!("{}", text);
}
}
→ Нет проблем: text
действует до конца main
.