rust - 当我可以绑定(bind)可变变量时,为什么还需要重新绑定(bind)/隐藏?

标签 rust

当我可以绑定(bind)可变变量时,为什么还需要重新绑定(bind)/隐藏?考虑:

let x = a();
let x = b(x);

对比

let mut x = a();
x = b(x);

可变变量绑定(bind)允许在 this 之上对该变量进行可变借用。 但是与可变绑定(bind)相比,阴影是否有一些优势?

最佳答案

因为两者的作用完全不同。


要真正了解发生了什么,我们需要从头开始:什么是绑定(bind)?绑定(bind)是什么意思?

让我们考虑一个简单的函数:fn hello() -> String;

像这样调用这个函数时:

fn main() {
    hello();
}

会发生什么?

该函数返回一个 String,它会被立即丢弃(执行 Drop,因为它释放了内存)。

结果被删除是因为它没有绑定(bind)到变量名,语言规则说如果没有绑定(bind)则可以立即删除1

但是,如果我们绑定(bind)这个结果,我们就会延长这个值的生命周期,并且我们可以通过这个绑定(bind)访问它……一段时间。

fn main() {
    let value = hello();

    std::mem::drop(value);

    println!("{}", value); // Error: moved out of value
}

是眼前的问题:在 Rust 中,值的生命周期独立于绑定(bind)的范围。

一个值甚至不需要在其绑定(bind)退出其范围之前被删除:它可以转移到另一个值(类似于从函数返回)。

fn main() {
    let x;
    {
        let y = hello();
        x = y;
    }
    println!("{}", x);
}

1 如果绑定(bind)到 _ 也会发生同样的情况。


现在我们知道了绑定(bind)和值不同这一事实,让我们检查这两个片段。

第一个阴影片段,与你的不同:

fn main() {
    let x = a();
    let x = b();
}

步骤,按顺序:

  • 表达式 a() 创建一个值,该值绑定(bind)到 x
  • 表达式 b() 创建一个值,该值绑定(bind)到 x
  • b() 创建的值被丢弃
  • a() 创建的值被丢弃

请注意,x 被重新绑定(bind)的事实不会影响先前绑定(bind)的值的生命周期。

从技术上讲,它的行为就像 b() 的结果绑定(bind)到 y 一样,唯一的异常(exception)是之前的 xy 在范围内时绑定(bind)不可访问。

现在,可变片段:

fn main() {
    let mut x = a();
    x = b();
}

步骤,按顺序:

  • 表达式 a() 创建一个值,该值绑定(bind)到 x
  • 表达式 b() 创建一个值,该值绑定(bind)到 x,以及先前的值(由 a() 创建)被丢弃
  • b() 创建的值被丢弃

再一次,访问以前的值是不可能的,但是在使用阴影时暂时不可能(如果在较小的范围内进行阴影),使用赋值则永远不可能,因为值被删除了。

关于rust - 当我可以绑定(bind)可变变量时,为什么还需要重新绑定(bind)/隐藏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40621325/

相关文章:

Rust 从可变 self 函数调用可变 self 函数

rust - 是否可以将变量作为标识符传递给宏?

rust - 如何满足 Iterator trait bound 以便在这里使用 Rayon?

rust - 语法问题函数返回函数不清楚

rust - 什么是函数签名和类型?

rust - Rust 语言中的 &'a 是什么

rust - 如何修改使用 serde 序列化的 Result<T,E> 的 JSON 输出?

rust - 为什么 `tokio::join!` 宏在 Rust 中不需要 `await` 关键字?

python - 执行从 Rust/Python 源代码生成的 LLVM IR 代码

rust - 将 TaskManager 脚本从 gdscript/Godot 迁移到 bevy 和 rust