构造器

说明

Rust 没有语言层面的构造器。 取而代之的是常用一个[关联函数][] new 创建对象:

示例

  1. /// Time in seconds.
  2. ///
  3. /// # Example
  4. ///
  5. ///

/// let s = Second::new(42); /// assert_eq!(42, s.value()); /// `` pub struct Second { value: u64 } impl Second { // Constructs a new instance of [Second`]. // Note this is an associated function - no self. pub fn new(value: u64) -> Self { Self { value } } /// Returns the value in seconds. pub fn value(&self) -> u64 { self.value } }

  1. ## Default Constructors
  2. Rust supports default constructors with the [`Default`][std-default] trait:
  3. ```rust,ignore
  4. // A Rust vector, see liballoc/vec.rs
  5. pub struct Vec<T> {
  6. buf: RawVec<T>,
  7. len: usize,
  8. ```rust
  9. /// Time in seconds.
  10. ///
  11. /// # Example
  12. ///
  13. ///

/// let s = Second::default(); /// assert_eq!(0, s.value()); /// `` pub struct Second { value: u64 } impl Second { /// Returns the value in seconds. pub fn value(&self) -> u64 { self.value } } impl<T> Vec<T> { // Constructs a new, emptyVec`. // Note this is a static method - no self. // This constructor doesn’t take any arguments, but some might in order to // properly initialise an object pub fn new() -> Vec { // Create a new Vec with fields properly initialised. Vec { // Note that here we are calling RawVec’s constructor. buf: RawVec::new(), len: 0, } impl Default for Second { fn default() -> Self { Self { value: 0 } } }

  1. `Default` can also be derived if all types of all fields implement `Default`,
  2. like they do with `Second`:
  3. ```rust
  4. /// Time in seconds.
  5. ///
  6. /// # Example
  7. ///
  8. ///

/// 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 } } ```

Note: When implementing Default for a type, it is neither required nor recommended to also provide an associated function new without arguments.

Hint: The advantage of implementing or deriving Default is that your type can now be used where a Default implementation is required, most prominently, any of the *or_default functions in the standard library.

参阅