什么时候被临时毁坏?

时间:2017-06-26 13:30:23

标签: rust

到目前为止,我认为在产生它的陈述的评估结束时,临时被破坏了。

但是,使用临时初始化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);
}

那么,临时被破坏的确切规则是什么?

1 个答案:

答案 0 :(得分:1)

让我们先看看第二条失败的行:

let cmd = Cmd::new(&None);

&None创建一个具有单行生命周期的临时文件。 Cmd::new返回具有相同生命周期的Cmd。然后我们尝试将该临时值存储在let的变量中。

Rust reference states

  

当创建分配给let的临时右值时   但是,声明是在生命周期中创建的   封闭的块而不是......

它会尝试增加Cmd临时值的生命周期,但这取决于&None临时值的生命周期,并且因为该临时值实际上并未存储在let中(关于暂时持续到语句结束的临时规则的例外),它的生命周期小于cmd的生命周期,并且你得到一生的错误。

直接struct语句有效,因为let生存期适用于struct及其成员。

它对Some(枚举)不起作用这一事实对我来说似乎是一个错误(或者至少是一个缺失的特征)。