You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 10:21:37