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

Rust结构体对象声明与初始化:代码中(1)与(2)的差异是什么?

Rust结构体两种初始化方式的区别

先看你给出的代码:

pub struct Person
{
    name: String,
    age: u32,
}

impl Person {
    pub fn new(name: String, age: u32) -> Person {
        Person { name, age }
    }
    pub fn show(self)
    {
        println!("Name: {}, Age: {}", self.name, self.age);
    }
}

fn main()
{
    let person = Person { name: "Alice".to_string(), age: 33 }; // (1)
    let person2 = Person::new("Bob".to_string(), 99 );// (2)
}

下面说标记(1)和(2)的核心区别:

  • 直接字面量初始化(方式1)
    这是Rust原生自带的语法,必须列出结构体所有字段并赋值,写法直白,能一眼对应字段与取值。但它有访问限制:如果结构体的字段是私有的(未加pub),这种初始化方式只能在结构体定义的同一个模块内使用,外部模块无法访问私有字段,也就没法这么初始化。

  • 自定义构造函数初始化(方式2)
    这是开发者在impl Person块中实现的关联函数,函数名不一定是new,可以自定义(比如create、with_default_age等)。这种方式的核心优势:

    1. 可封装额外逻辑:比如给年龄加合法性校验、给某些字段设置默认值(比如用户不传年龄就默认18),甚至自动转换参数类型(比如把&str转为String,调用者无需手动写to_string());
    2. 封装内部实现:哪怕结构体字段全是私有的,只要构造函数是pub的,外部模块就能通过它创建对象,无需暴露内部字段,能保证结构体数据始终符合预期;
    3. 写法更简洁:结构体字段较多时,无需重复写每个字段名,只需按顺序传参即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 09:35:57