Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 什么时候是临时销毁?_Rust - Fatal编程技术网

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)
的操作。而且您更新的代码没有任何枚举。。。?