为什么Rust不尽早释放对变量的引用?

jgwigjjp  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(94)

考虑以下情况:

fn main() {
    let mut count = 0;
    let mut inc = || {
        count += 1;
        println!("`count`: {}", count);
    };
    inc();
    // let _reborrow = &count;    ERROR
    inc();
}

字符串
如果我不删除注解掉的行

let _reborrow = &count;


编译器会说:不能将count作为不可变的对象借用,因为它也是作为可变对象借用的。
为什么编译器不会认为我在inc()之后释放了对count的可变引用,然后在用let _reborrow = &count行获取对count的不可变引用之后立即释放了它,然后用inc()再次获取对count的不可变引用?
我想对上面的问题得到一个解释,如果遵循上面的想法,那么上面的代码将编译[不注解那一行],而下面的情况将导致编译错误:

fn main() {
    let mut count = 0;
    let mut inc = || {
        count += 1;
        println!("`count`: {}", count);
    };
    inc();
    let _reborrow = &count;
    inc();
    println!("{}", _reborrow);
}

8i9zcol2

8i9zcol21#

然后用inc()再次获取对count的不可变引用?
具体怎么做呢?你如何与闭包通信以获取引用?
闭包必须为自己保留引用,因为没有人可以给它一个副本。记住闭包可以是未知的,例如从函数返回,然后没有办法“暂停”和“恢复”它对引用的所有权。

相关问题