gpt4 book ai didi

rust - match + RefCell = X 活得不够长

转载 作者:行者123 更新时间:2023-11-29 08:06:24 24 4
gpt4 key购买 nike

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

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

除非我需要检查是否有任何错误,否则这是可行的:

pub fn add(&mut self, mut m: Box<Item>) {
if let Some(e) = m.init() {
//process error
} else {
self.items.push(m); //won't compile, m is borrowed
}
}

公平。需要用RefCell .然而,这

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

以奇怪的结尾

error: `rc` does not live long enough
if let Some(e) = rc.borrow_mut().init() {
^~
note: reference must be valid for the destruction scope surrounding block at 75:60...
pub fn add_module(&mut self, mut m: Box<RuntimeModule>) {
^
note: ...but borrowed value is only valid for the block suffix following statement 0 at 76:30
let rc = RefCell::new(m);

我几乎尝试了所有方法:普通盒子,Rc 'ed 框,RefCell 'ed 框,Rc 'ed RefCell .试图适应this answer以我为例。没用。

完整示例:

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

( Playground )

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

最佳答案

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

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

关于rust - match + RefCell = X 活得不够长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38213453/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com