Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 如何创建Rc的右值链接<;RefCell<;T>&燃气轮机;工作_Rust - Fatal编程技术网

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)
}