为什么在Rust中“按引用捕获”等同于“按值捕获引用”?

摘自 Huon Wilson在 Rust 中的发现闭包:

完全按值捕获也比按引用捕获更通用:引用类型在 Rust 中是一流的,因此“按引用捕获”与“按值捕获引用”相同。因此,与 C++ 不同,按引用捕获和按值捕获之间几乎没有根本区别,而且 Rust 所做的分析实际上并不是必需的:它只是让程序员的生活更轻松。

我努力想办法解决这个问题。如果您“按值”捕获引用,您不捕获存储在堆上的数据吗?或者它是否引用了在堆栈中找到的引用的指针值?

回答

我觉得文章的意思是说效果差不多。不可变引用实现了 Copy trait,因此当您按值捕获引用时,它会被复制。所以基本上你只是创建了一个对相同数据的共享引用。

fn as_ref(_x: &String) {}

fn as_mut(_x: &mut String) {}

fn main() {
    let mut x = String::from("hello world");
    let y = &x;

    let _ = move || {
        as_ref(y); // here you moved y but it
                   // basically created a copy
    };

    let z = y; // can be used later

    // The same cannot be done by mutable
    // refs because they don't
    // implement Copy trait
    
    let y = &mut x;

    let _ = move || {
        as_mut(y); // here you moved y and
                   // it cannot be used outside
    };

    // ERROR! Cannot be used again
    //let z = y;
}

操场


以上是为什么在Rust中“按引用捕获”等同于“按值捕获引用”?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>