คอนสตรัคเตอร์
คำอธิบาย
ภาษา 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 ทั้งหลายในไลบรารีมาตรฐาน
ดูเพิ่มเติม
-
แนวปฏิบัติ Default (The Default Trait) สำหรับคำอธิบายเชิงลึกเพิ่มเติมเกี่ยวกับ trait
Default -
แพตเทิร์นบิลเดอร์ (Builder Pattern) สำหรับการสร้างออบเจกต์ ในกรณีที่มีหลายรูปแบบการตั้งค่า
-
API Guidelines/C-COMMON-TRAITS สำหรับ การอิมพลีเมนต์ทั้ง
Defaultและnew