为什么我不能阻挡一个盒子?

Moe*_*ius 2 rust borrow-checker

考虑以下代码(在操场上):

// calling this function move the ownership of nbr to is_even
// at the end of the function is_even doesn't give the ownership back
fn is_even(nbr: Box<i32>) -> bool {
    *nbr % 2 == 0
}

fn main() {
    let integer = Box::new(42);
    if is_even(integer) {
        print!("is even ");
    }
    println!("{}", integer);
}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息:

example.rs:10:17: 10:24 error: use of moved value: `integer` [E0382]
example.rs:10   println!("{}", integer);

example.rs:7:13: 7:20 note: `integer` moved here because it has type `Box<i32>`, which is non-copyable
example.rs:7    if is_even(integer) {
Run Code Online (Sandbox Code Playgroud)

我不明白为什么.好吧,当我打电话时is_even,我将所有权赋予此功能,但在该功能结束时is_even不再需要所有权.这是一个不可变的(只读)所有权转移,因此我们确信在main保留时不会删除integer它 - >使用它似乎是安全的.

仍有这个错误.为什么以及解决方法是什么?

She*_*ter 6

当我打电话时is_even,我将所有权赋予此功能

究竟.你转让了所有权.你没有它了,功能会做你想要的.在这种情况下,它将释放内存,因此在调用后你绝对不能使用它.

该功能不再需要所有权

这就是它被删除的原因.

这是一种不可变(只读)的所有权转移

那不存在.你完全转移了所有权,没有一半关于它.

所以我们确定它没有被删除

实际上,我们确信它已被释放,这是一件非常好的事情.Rust为我们管理这个,所以你永远不必问"谁应该释放它?"

那么你如何解决它?这很简单:传递对内部值的引用,而不是整个框.这种借用值(性情不定地与否,由你)和所有权不转移.

fn is_even(nbr: &i32) -> bool { ... }
Run Code Online (Sandbox Code Playgroud)

  • 我做了一个生锈的帖子,你没有编辑它!你身体状况良好吗?:p (3认同)