Rust 什么时候是临时销毁?
到目前为止,我一直假设一个临时变量在生成它的语句的求值结束时被销毁 但是,使用临时变量初始化Rust 什么时候是临时销毁?,rust,Rust,到目前为止,我一直假设一个临时变量在生成它的语句的求值结束时被销毁 但是,使用临时变量初始化结构的字段时,似乎出现了异常 PeterHall在评论中提供了一个简单的例子,我将其简化了一点: struct Wrapper<'a> { cmd: &'a Cmd<'a>, } struct Cmd<'a> { args: &'a Option<String>, } impl <'a> Cmd<'a&g
结构
的字段时,似乎出现了异常
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);
}
struct包装器{
参数:&'a选项,
}
恳求{
fn new(args:&'a Option)->Cmd让我们先看看第二个失败行:
let cmd = Cmd::new(&None);
&None
创建一个具有单行生存期的临时变量。Cmd::new
返回一个具有相同生存期的Cmd
。然后我们尝试使用let
将该临时变量存储在变量中
委员会:
当创建临时右值并将其分配给let时
但是,创建的临时声明的生存期为
而不是封闭块
它试图增加Cmd
临时变量的生存期,但这取决于&None
临时变量的生存期,并且由于该临时变量实际上没有存储在中,所以让
保存(关于临时变量的规则的例外情况持续到语句结束),它的生存期小于cmd
的生存期,您将得到一个生存期错误
直接结构语句可以工作,因为let
生存期适用于结构及其成员
它不适用于某些
(枚举)的事实对我来说似乎是一个bug(或者至少是一个缺少的特性)。我不知道解释,但可以肯定这是不一致的。感觉与“生命周期检查在函数边界处停止”方面有关。工作案例有一个结构初始值设定项,因此更“透明”对于编译器来说,失败的情况是函数调用。@Shepmaster:事实上可能是这样的,因为所有借用都是针对局部变量的字段独立工作的,而不是跨函数调用。@Shepmaster:啊…看起来枚举构造函数被当作函数处理…(请参阅更新的测试)@MatthieuM。因为它们是函数:-)这就是为什么您可以执行类似于iterator.map(MyEnum::Alpha)
的操作。而且您更新的代码没有任何枚举。。。?