到目前为止,我认为在产生它的陈述的评估结束时,临时被破坏了。
但是,使用临时初始化struct
字段时会出现异常。
PeterHall在对code sample illustrating the difference的评论中提供了一个简单的his answer,其中我简化了简化:
struct Wrapper<'a> {
cmd: &'a Cmd<'a>,
}
struct Cmd<'a> {
args: &'a Option<String>,
}
impl <'a> Cmd<'a> {
fn new(args: &'a Option<String>) -> Cmd<'a> {
Cmd {
args: args,
}
}
}
pub fn main() {
// OK
let cmd = Cmd {
args: &None,
};
// OK
let cmd = Wrapper {
cmd: &Cmd {
args: &None,
}
};
// Lifetime error
let cmd = Some(Cmd {
args: &None,
});
// Lifetime error
let cmd = Cmd::new(&None);
}
那么,临时被破坏的确切规则是什么?
答案 0 :(得分:1)
让我们先看看第二条失败的行:
let cmd = Cmd::new(&None);
&None
创建一个具有单行生命周期的临时文件。 Cmd::new
返回具有相同生命周期的Cmd
。然后我们尝试将该临时值存储在let
的变量中。
当创建分配给let的临时右值时 但是,声明是在生命周期中创建的 封闭的块而不是......
它会尝试增加Cmd
临时值的生命周期,但这取决于&None
临时值的生命周期,并且因为该临时值实际上并未存储在let
中(关于暂时持续到语句结束的临时规则的例外),它的生命周期小于cmd
的生命周期,并且你得到一生的错误。
直接struct语句有效,因为let
生存期适用于struct及其成员。
它对Some
(枚举)不起作用这一事实对我来说似乎是一个错误(或者至少是一个缺失的特征)。