Rust 如何创建Rc的右值链接<;RefCell<;T>&燃气轮机;工作
我正试图正式使用Rust 如何创建Rc的右值链接<;RefCell<;T>&燃气轮机;工作,rust,Rust,我正试图正式使用Rc。这很好: use std::cell::{Ref, RefCell}; use std::rc::Rc; struct SP<T> { object: Rc<RefCell<T>>, } impl<T> SP<T> { pub fn new(value: T) -> SP<T> { SP { object: Rc::new(RefCell
Rc
。这很好:
use std::cell::{Ref, RefCell};
use std::rc::Rc;
struct SP<T> {
object: Rc<RefCell<T>>,
}
impl<T> SP<T> {
pub fn new(value: T) -> SP<T> {
SP {
object: Rc::new(RefCell::new(value)),
}
}
pub fn get(&self) -> Ref<T> {
self.object.borrow()
}
}
// impl<T> Deref for SP<T> {
// type Target = T;
// fn deref(&self) -> &Self::Target {
// &self.object.borrow()
// }
// }
struct Test {
i: i32,
}
fn main() {
let t = Test { i: 42 };
let sp = SP::new(t);
let tt = sp.get().i;
println!("{}", tt)
}
我试图在注释掉的代码中实现这一点。问题是,
borrow()
生成的右值拒绝活得足够长,不能被语句的其余部分使用。我能在这段代码上施展什么魔法来说服它工作吗?TL;博士,你不能。这就是运行时/动态借用检查的要点,而不是编译时/静态借用检查。假设您可以这样做,那么RefCell
就已经允许您这样做了,并且您不需要包装器。不要真的认为在语句中包含get()一词会从根本上改变动态/静态借用易变性等。只需少键入6个字符。我想我可以叫它g,把它降到4个字符。不要求存储结果或任何东西,只希望右值在整个语句中持续。
fn main() {
let t = Test { i: 42 };
let sp = SP::new(t);
let tt = sp.i; // implicit 'dereference'
println!("{}", tt)
}