Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

คอนสตรัคเตอร์

คำอธิบาย

ภาษา Rust ไม่มีฟีเจอร์ Constructor เป็นคำสั่งเฉพาะของตัวภาษาเหมือนในภาษาเชิงวัตถุอื่นๆ แต่ธรรมเนียมปฏิบัติของชาว 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`].
    // 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
    }
}
}

คอนสตรัคเตอร์เริ่มต้น (Default Constructors)

Rust รองรับคอนสตรัคเตอร์เริ่มต้นผ่าน trait Default:

#![allow(unused)]
fn main() {
/// Time in seconds.
///
/// # Example
///
/// ```
/// 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 Default for Second {
    fn default() -> Self {
        Self { value: 0 }
    }
}
}

Default ยังสามารถ derive ได้โดยอัตโนมัติหากทุกชนิดข้อมูลของทุกฟิลด์อิมพลีเมนต์ Default ไว้อยู่แล้ว เช่นเดียวกับกรณีของ Second:

#![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 ที่ไม่รับพารามิเตอร์ควบคู่กัน เนื่องจาก new คือธรรมเนียมปฏิบัติมาตรฐานของการสร้างออบเจกต์ใน Rust และผู้ใช้คาดหวังว่าจะมีเมท็อดนี้ให้เรียกใช้เสมอ ดังนั้นหากมีความสมเหตุสมผลที่คอนสตรัคเตอร์พื้นฐานจะไม่รับอาร์กิวเมนต์ใดๆ ก็ควรเขียนเมท็อด new() เตรียมไว้ด้วย แม้ว่าการทำงานภายในจะเหมือนกับ default() ทุกประการก็ตาม

คำแนะนำ: ข้อดีของการอิมพลีเมนต์หรือ derive trait Default คือ ชนิดข้อมูลของคุณจะสามารถนำไปใช้งานร่วมกับฟังก์ชันหรือคอมโพเนนต์อื่นๆ ที่ต้องการ Default ได้ทันที ตัวอย่างที่เห็นได้ชัดเจนที่สุดคือ บรรดาฟังก์ชันตระกูล *or_default ทั้งหลายในไลบรารีมาตรฐาน

ดูเพิ่มเติม