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 函数。
参见