Rust 匹配+;RefCell=X的寿命不够长

Rust 匹配+;RefCell=X的寿命不够长,rust,borrow-checker,Rust,Borrow Checker,我需要初始化一个项(fn init(&mut self)->选项),如果没有错误就使用它 pub fn add(&mut self, mut m: Box<Item>) { if let None = m.init() { self.items.push(m); } } 以奇怪的结尾 错误:`rc`寿命不够长 如果让一些(e)=rc.borrow_mut().init(){ ^~ 注:参考必须适用于75:60时块体周围的破坏范围。。。 发布f

我需要初始化一个项(
fn init(&mut self)->选项
),如果没有错误就使用它

pub fn add(&mut self, mut m: Box<Item>) {
    if let None = m.init() {
        self.items.push(m);
    }
}
以奇怪的结尾

错误:`rc`寿命不够长
如果让一些(e)=rc.borrow_mut().init(){
^~
注:参考必须适用于75:60时块体周围的破坏范围。。。
发布fn添加模块(&mut self,mut m:Box){
^
注意:…但借用值仅对76:30时语句0后面的块后缀有效
设rc=RefCell::new(m);
我几乎什么都试过了:普通盒子、
Rc
'ed盒子、
RefCell
'ed盒子、
Rc
'ed
RefCell
。试着适应我的情况。没有用

完整示例:

use std::cell::RefCell;
use std::error::Error;

trait Item {
    fn init(&mut self) -> Option<&Error>;
}

struct ItemImpl {}

impl Item for ItemImpl {
    fn init(&mut self) -> Option<&Error> {
        None
    }
}

//===========================================

struct Storage {
    items: Vec<Box<Item>>,
}

impl Storage {
    fn new() -> Storage {
        Storage{
            items: Vec::new(),
        }
    }

    fn add(&mut self, mut m: Box<Item>) {
        let rc = RefCell::new(m);

        if let Some(e) = rc.borrow_mut().init() {           
            //process error         
        } else {
            self.items.push(*rc.borrow_mut())
        }
    }
}

fn main() {
    let mut s = Storage::new();
    let mut i = Box::new(ItemImpl{});
    s.add(i);
}
使用std::cell::RefCell;
使用std::error::error;
特征项{
fn init(&mut self)->选项;
}
结构itempl{}
ItemImpl的impl项{
fn init(&mut self)->选项{
没有一个
}
}
//===========================================
结构存储{
项目:Vec,
}
impl存储{
fn new()->存储{
储藏{
项目:Vec::new(),
}
}
fn添加(&mut self,mut m:Box){
设rc=RefCell::new(m);
如果让某些(e)=rc.borrow_mut().init(){
//过程错误
}否则{
self.items.push(*rc.borrow_mut())
}
}
}
fn main(){
让mut s=Storage::new();
让muti=Box::new(itempl{});
s、 加(i);
}
()


UPD:正如所建议的,这是一个像我一样的错误“家族”,解释得很好。但是我的案例有更简单的解决方案。

正如krdln所建议的,解决这个问题的最简单方法是返回
if
块,从而确定借用范围:

fn add(&mut self, mut m: Box<Item>) {
    if let Some(e) = m.init() {
        //process error
        return;
    } 
    self.items.push(m);
}
fn添加(&mut self,mut m:Box){
如果让一些(e)=m.init(){
//过程错误
返回;
} 
自我物品推送(m);
}

RefCell无法解决此问题。这是借用检查器的已知限制,对此存在一些问题/答案。我指出了一个可能的重复项,但我认为我们应该找到一个明确的答案(如果可能).@Shepmaster你知道更好的副本吗?@malbarbo的可能副本我认为它与那一个不完全相同。它与从
&mut self
方法返回引用有关。这会导致可变借用持续存在。与此同时,我找到了一个解决方案,但它在我看来非常丑陋。最简单的方法是在处理错误后使用early
return
。@Shepmaster我认为它实际上是完全相同的,
选项
也借用了
&mut self
,lifetime参数只是被elision隐藏了。顺便说一句,这可能是相关的
use std::cell::RefCell;
use std::error::Error;

trait Item {
    fn init(&mut self) -> Option<&Error>;
}

struct ItemImpl {}

impl Item for ItemImpl {
    fn init(&mut self) -> Option<&Error> {
        None
    }
}

//===========================================

struct Storage {
    items: Vec<Box<Item>>,
}

impl Storage {
    fn new() -> Storage {
        Storage{
            items: Vec::new(),
        }
    }

    fn add(&mut self, mut m: Box<Item>) {
        let rc = RefCell::new(m);

        if let Some(e) = rc.borrow_mut().init() {           
            //process error         
        } else {
            self.items.push(*rc.borrow_mut())
        }
    }
}

fn main() {
    let mut s = Storage::new();
    let mut i = Box::new(ItemImpl{});
    s.add(i);
}
fn add(&mut self, mut m: Box<Item>) {
    if let Some(e) = m.init() {
        //process error
        return;
    } 
    self.items.push(m);
}