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

Rust如何实例化来自其他模块、所有字段均为私有的struct

解决方案

报错原因

Rust 模块的可见性规则要求:结构体的字段默认仅对定义它的模块可见,跨模块场景下,外部代码无法直接访问私有字段,也无法通过结构体字面量MyStruct {}的方式直接实例化所有字段都是私有的结构体。

推荐解决方案

方案1:实现公开构造函数(最常用)

这是Rust生态约定俗成的封装方案,你可以在my_struct.rs的impl MyStruct块中新增公开的关联函数作为构造方法:

// my_struct.rs 新增代码
impl MyStruct {
    // 公开构造方法
    pub fn new(private_field_1: Option<i32>, private_field_2: Option<i32>) -> Self {
        Self {
            private_field_1,
            private_field_2
        }
    }

    // 原有方法可同步优化:不需要手动match,直接返回字段即可,同时只读get方法不需要&mut self
    pub fn get_private_field_1(&self) -> Option<i32> {
        self.private_field_1
    }
}

之后在mod.rs中调用构造方法即可完成实例化:

// mod.rs 调整代码
mod my_struct;
use my_struct::MyStruct;

pub fn run() {
  // 传入对应参数初始化
  let my_struct_instance = MyStruct::new(Some(123), None);
}

方案2:实现Default trait实现默认初始化

如果你的结构体支持无参数默认初始化,可以直接实现Default trait:

// my_struct.rs 新增代码
impl Default for MyStruct {
    fn default() -> Self {
        Self {
            private_field_1: None,
            private_field_2: None
        }
    }
}

之后在mod.rs中可以直接用默认方式实例化:

pub fn run() {
  // 默认初始化
  let my_struct_instance = MyStruct::default();
}

方案3:公开字段(不推荐,会破坏封装)

如果业务确实需要外部直接访问、修改字段,可以把对应字段声明为pub:

pub struct MyStruct {
  pub private_field_1: Option<i32>,
  pub private_field_2: Option<i32>,
}

修改后即可直接用字面量实例化,但会失去封装性,非必要不建议使用。


内容的提问来源于stack exchange,提问作者Alika97

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 06:45:05