如何解决当变量在 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
的情况下是同一回事)。>
在您的示例中发生的是 move:Vec
首先从 main
的 vec0
移动到 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 举报,一经查实,本站将立刻删除。