微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当变量在 Rust 中移动时,它会在引擎盖下做变量阴影吗?

如何解决当变量在 Rust 中移动时,它会在引擎盖下做变量阴影吗?

我想知道当变量从一个作用域移动到另一个作用域时,rust 是否在幕后做变量阴影。

因为当我将变量移动到另一个函数时,可以更改另一个函数的签名以使变量可变,但是当变量从其他函数移动/返回到 main 时,它不再是不可变的。

我只是对这里发生的事情感到好奇。

fn main() {
    let vec0 = Vec::new(); // immutable by default
    let mut vec1 = foreign_func(vec0); // vec0 has Now moved
    // Is foreign_func returning a mutable vector? Because without `mut` keyword vec1 is immutable by default.
    vec1.push(10);
}

fn foreign_func(mut vec: Vec<i32>) -> Vec<i32> { 
    // argument passed for vec is Now mutable in this scope.
    // Is this like variable shadowing?
    // let test = 10;
    // let mut test = 20;
    vec.push(20);
    vec
}

解决方法

没有不可变的 Vec 之类的东西,它只是一个可以不可变的变量或借用(实际上是唯一的/排他的,但在 Vec 的情况下是同一回事)。>

在您的示例中发生的是 moveVec 首先从 mainvec0 移动到 foreign_func 的 {{ 1}},然后回到 vec,这次是 main。这些绑定中的一些是 vec1,一些不是,但这与移动的值无关。事实上,将 mut 从不可变变量转移到可变变量可以像 Vec 一样简单,它编译得很好。

正如 Peter Hall 所指出的,阴影是一个不同的概念:引入一个新变量,它有意共享现有变量的名称。由于这两个变量具有相同的名称,因此在其范围内只能访问最近的一个。请注意,阴影变量和阴影变量不必具有相同的类型,并且阴影时可能会或可能不会发生移动:

let mut vec1 = vec0

当没有移动时,阴影值可能会在操作结束后再次变得有用。在这种情况下,可以在单独的作用域中引入阴影变量,以便在内部作用域完成后重新出现旧值:

fn shadow1(v: Option<Vec<u32>>) {
    // here shadowing moves the old value
    let v = v.unwrap_or_else(Vec::new);
}

fn shadow2(v: Vec<u32>) {
    // here shadowing not accompanied by move
    let v = v.as_slice();
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。