03-构造器

构造器 — Rust Design Patterns

译文 · 基于 Rust Design Patterns

原文链接: https://rust-unofficial.github.io/patterns/idioms/ctor.html

构造器

描述

Rust 没有作为语言构造的构造器。约定是使用关联函数 new 来创建对象:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/// 以秒计的时间。
///
/// # 示例
///
/// ```
/// let s = Second::new(42);
/// assert_eq!(42, s.value());
/// ```
pub struct Second {
    value: u64,
}

impl Second {
    // 构造 [`Second`] 的新实例。
    // 注意这是关联函数——没有 self。
    pub fn new(value: u64) -> Self {
        Self { value }
    }

    /// 返回以秒为单位的值。
    pub fn value(&self) -> u64 {
        self.value
    }
}

默认构造器

Rust 通过 Default trait 支持默认构造器:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/// 以秒计的时间。
///
/// # 示例
///
/// ```
/// let s = Second::default();
/// assert_eq!(0, s.value());
/// ```
pub struct Second {
    value: u64,
}

impl Second {
    /// 返回以秒为单位的值。
    pub fn value(&self) -> u64 {
        self.value
    }
}

impl Default for Second {
    fn default() -> Self {
        Self { value: 0 }
    }
}

若所有字段的类型都实现了 Default,也可以派生 Default, Second 就是这种情况:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
/// 以秒计的时间。
///
/// # 示例
///
/// ```
/// let s = Second::default();
/// assert_eq!(0, s.value());
/// ```
#[derive(Default)]
pub struct Second {
    value: u64,
}

impl Second {
    /// 返回以秒为单位的值。
    pub fn value(&self) -> u64 {
        self.value
    }
}

注意: 类型同时实现 Default 和无参 new 构造器是常见且符合预期的。 new 是 Rust 中的构造器约定,用户期望它存在,因此如果基本构造器不接受参数是合理的, 那就应当提供它,即便它在功能上与 default 完全相同。

提示: 实现或派生 Default 的好处是,你的类型现在可以用在需要 Default 实现的地方, 最突出的是标准库中任何 *or_default 函数。

参见

最后修改 August 21, 2026: 更新 (76fc81a2e)