将Db结构体移至db.rs后出现私有字段无法编辑错误
问题原因
原来Db定义在根模块(lib.rs),handler.rs属于根模块的同级子模块,Rust允许同一模块(及其子模块)访问私有字段。但将Db移到db子模块后,handler.rs和db是同级子模块,Db的entries字段默认私有,仅能在db模块内部访问,外部模块(如handler)无权直接操作,因此触发编译错误。
解决方案
有两种常见处理方式:
方式一:将entries设为公共(不推荐,破坏封装)
修改db.rs中的Db结构体,给entries添加pub修饰:
#[derive(Clone, Debug)] pub struct Db { pub entries: Rc<RefCell<HashMap<String, Bytes>>>, }
方式二:提供公共方法操作数据(推荐,符合封装原则)
避免直接暴露内部字段,在Db的实现中添加公共方法来处理数据操作:
修改db.rs的Db实现:
impl Db { pub fn new() -> Db { Db { entries: Rc::new(RefCell::new(HashMap::new())), } } // 新增公共插入方法 pub fn insert(&self, key: String, value: Bytes) -> Option<Bytes> { self.entries.borrow_mut().insert(key, value) } }
然后更新handler.rs的write方法,调用这个公共方法:
pub fn write(&mut self, arr: &[String]) -> Result<&str, &'static str> { let key = &arr[1]; let value = &arr[2]; let val = value.clone(); let p = self.db.insert(String::from(key), Bytes::from(val)); // 补充后续逻辑,比如返回结果 Ok("success") }
内容的提问来源于stack exchange,提问作者Ashish Singh
相关产品推荐
相关产品推荐

