rust - 当你在 Rust 中可变地隐藏一个 Vector 时会发生什么?

标签 rust move-semantics ownership shadowing

我目前正在学习 ruSTLings 类(class),当这个关于 move 语义的练习出现时,我感到很困惑。这是它的要点:

fn main(){
  let vec0 = Vec::new();
  let mut vec1 = fill_vec(vec0);
  //stuff happens
}

fn fill_vec(vec: Vec<i32>) -> Vec<i32> {
  let mut vec = vec;
  //do stuff
  vec
}

据我所知,不可变的 vec0 正在作为参数 vec move 到 fill_vec,然后可变 let mut vec = vec; 覆盖。由于 Vectors 是对堆存储的引用,这是否意味着 clone() 由于阴影而发生,或者是否重复使用了相同的指针并使其可变?为什么要在这种情况下使用阴影?

最佳答案

is the same pointer reused and just made mutable?

是的。完全相同的对象,在运行时它本质上是一个空操作。

Why would shadowing be used in this case at all?

有些人喜欢通过阴影暂时“锁定”和“解锁”绑定(bind)的模式,例如

let a = …;
…
let mut a = a;
// mutate `a` in-place
let a = a; // lock to readonly again

这真的只是个人喜好。这里:

  • 本可以引入一个新变量,但它真的更有用吗?它会叫什么? vec_mut?不像源可以重复使用,它被移走了。
  • 或者,输入参数可以直接是 mut vec: ...

这主要取决于个人选择。

关于rust - 当你在 Rust 中可变地隐藏一个 Vector 时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67036004/

相关文章:

closures - 我的代码中的非法移动在哪里?

rust - 在Rust中对 “caching proxy”拥有适当的所有权?

linux - 如何在 RHEL Linux 服务器上安装 Cargo?

rust - Rust 中结构的惯用迭代器 + 突变?

rust - 如何初始化数组并保存对其项的引用?

struct - 我们什么时候应该使用结构而不是枚举?

rust - 如何重新使用已将值移出的盒子?

php mkdir() 和 apache 所有权问题

c++ - 如何转发元组的值? std::get(move(tuple))vs.forward(std::get(tuple))

c++ - 将左值绑定(bind)到右值引用时 move 变量的语义和生命周期