到目前为止,我认为在产生它的声明的评估结束时,临时性被破坏了.
但是,当使用临时初始化a的字段时,似乎存在异常struct.
PeterHall帮助提供了一个简单的代码示例,说明评论与他的答案的区别,我简化了一点:
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);
}
Run Code Online (Sandbox Code Playgroud)
那么,临时被破坏的确切规则是什么?
让我们先看看第二个失败的行:
let cmd = Cmd::new(&None);
Run Code Online (Sandbox Code Playgroud)
&None创建一个具有单行生命周期的临时对象。Cmd::new返回Cmd具有相同生命周期的 a 。然后我们尝试将该临时值存储在变量中let。
Rust参考文献指出:
然而,当创建一个临时右值并将其分配给 let 声明时,该临时右值是使用封闭块的生命周期创建的......
它尝试增加Cmd临时变量的生命周期,但这取决于&None临时变量的生命周期,并且由于该临时变量实际上并未存储在 a 中let(关于临时变量持续到语句结束的规则的例外),它的生命周期小于 的生命周期,cmd并且您会得到生命周期错误。
直接结构语句有效,因为let生命周期适用于结构及其成员。
它不适用于Some(枚举)这一事实对我来说似乎是一个错误(或者至少是一个缺失的功能)。
| 归档时间: |
|
| 查看次数: |
223 次 |
| 最近记录: |