构造器
说明
Rust语言没有直接提供构造器,通常用关联函数associated function的new
方法创建一个对象:
#![allow(unused)] fn main() { /// Time in seconds. /// /// # Example /// /// ``` /// let s = Second::new(42); /// assert_eq!(42, s.value()); /// ``` pub struct Second { value: u64 } impl Second { // 创建一个秒实例 Constructs a new instance of [`Second`]. // 注意这是一个关联函数 - 没有self pub fn new(value: u64) -> Self { Self { value } } /// 返回以秒为单位的数值 pub fn value(&self) -> u64 { self.value } } }
Default
Rust提供了Default
trait来实现默认构造函数:
#![allow(unused)] fn main() { /// Time in seconds. /// /// # Example /// /// ``` /// 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
:
#![allow(unused)] fn main() { /// Time in seconds. /// /// # Example /// /// ``` /// let s = Second::default(); /// assert_eq!(0, s.value()); /// ``` #[derive(Default)] pub struct Second { value: u64 } impl Second { /// Returns the value in seconds. pub fn value(&self) -> u64 { self.value } } }
注意:
当为一个类型实现Default
时,既不需要也不建议同时提供一个没有参数的关联函数new
。
提示:
实现或派生Default
后,你的类型可以用于需要Default
实现的地方,
尤其是对 标准库中*or_default
函数的支持。
参见
-
Default 特性 中对
Default
trait有更详尽的描述。 -
创建者模式 讨论了创建多配置multiple configurations对象。