提问人:hnyls2002 提问时间:5/7/2023 更新时间:5/7/2023 访问量:109
Rust : drop(&RefMut) 而不是 drop(RefMut)?
Rust : drop(&RefMut) instead of drop(RefMut)?
问:
我知道当从 借入一个值时,我可以手动删除它以结束此借用。RefCell
但是,如果我使用对 a 的引用而不是直接使用 ,则 drop trait 似乎无效,无法结束此借用。RefMut
RefMut
那么,当试图放弃 ?以及为什么在此操作期间不会丢弃。如果引用的没有被删除,它什么时候会被删除?&RefMut
RefMut
RefMut
use std::cell::RefCell;
struct Data {
pub x: usize,
}
fn main() {
let c = RefCell::new(Data { x: 42 });
let b = &c.borrow_mut();
drop(b);
let mut d = c.borrow_mut();
d.x = 43;
println!("Hello, world!");
}
输出
thread 'main' panicked at 'already borrowed: BorrowMutError', src/main.rs:11:19
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
答:
3赞
Finomnis
5/7/2023
#1
只有当引用引用的值也存在于某处时,引用才能存在。在 C/C++ 中,创建对未存储在变量中的临时引用将是未定义的行为。然而,在 Rust 中,它是合法的,并且在后台创建了一个不可见的变量,该变量一直持续到当前范围结束。这称为临时生存期延长。更多信息可以在这里看到。
您可以通过引入另一个作用域来限制其生存期:
use std::cell::RefCell;
struct Data {
pub x: usize,
}
fn main() {
let c = RefCell::new(Data { x: 42 });
{
let b = &c.borrow_mut();
drop(b);
}
let mut d = c.borrow_mut();
d.x = 43;
println!("Hello, world!");
}
Hello, world!
或者将其存储在命名变量中:
use std::cell::RefCell;
struct Data {
pub x: usize,
}
fn main() {
let c = RefCell::new(Data { x: 42 });
let b_val = c.borrow_mut();
let b = &b_val;
drop(b);
drop(b_val);
let mut d = c.borrow_mut();
d.x = 43;
println!("Hello, world!");
}
Hello, world!
评论