0Pricing
Learn Rust Coding · บทเรียน

เมธอดเริ่มต้น

ค่าเริ่มต้นของคุณลักษณะ

เมธอดเริ่มต้น เป็นบทเรียน Learn Rust Coding ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Learn Rust Coding และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Learn Rust Coding มีบทเรียนทั้งหมด 4 บทเรียน

เมธอดที่มีส่วนเนื้อหา

เมธอดของเทรตไม่จำเป็นต้องมีเพียงลายเซ็นเท่านั้น เทรตสามารถจัดเตรียม การทำงานเริ่มต้น ซึ่งเป็นส่วนเนื้อหาของเมธอดที่ชนิดซึ่งนำไปใช้จะได้รับโดยอัตโนมัติ

วิธีนี้ช่วยลดโค้ดซ้ำซ้อนเมื่อมีหลายชนิด

เมธอดเริ่มต้น

เขียนส่วนเนื้อหาไว้ภายในเทรตโดยตรง ชนิดที่นำเทรตไปใช้จะสืบทอดส่วนนี้ไปโดยไม่ต้องเขียนโค้ดเพิ่มเติม

trait Greet {
    fn hello(&self) -> String {
        String::from("Hello there")
    }
}

struct Robot;
impl Greet for Robot {}

fn main() {
    println!("{}", Robot.hello());
}

การเขียนทับการทำงานเริ่มต้น

ชนิดใดก็ตามที่นำไปใช้สามารถเขียนทับการทำงานเริ่มต้นได้ด้วยการจัดเตรียมเวอร์ชันของตนเอง การเขียนทับนี้จะแทนที่การทำงานเริ่มต้นสำหรับชนิดนั้น

trait Greet {
    fn hello(&self) -> String { String::from("Hello there") }
}

struct Robot;
struct Pirate;
impl Greet for Robot {}
impl Greet for Pirate {
    fn hello(&self) -> String { String::from("Arr!") }
}

fn main() {
    println!("{}", Robot.hello());
    println!("{}", Pirate.hello());
}

การทำงานเริ่มต้นที่เรียกใช้เมธอดที่จำเป็น

เมธอดเริ่มต้นสามารถเรียกใช้เมธอดอื่นของเทรตเดียวกันได้ แม้เมธอดเหล่านั้นจะไม่มีการทำงานเริ่มต้นก็ตาม รูปแบบนี้มีประโยชน์มาก: ชนิดที่นำไปใช้จัดเตรียมแกนหลักขนาดเล็ก แล้วการทำงานเริ่มต้นจะต่อยอดเป็นพฤติกรรมที่สมบูรณ์ยิ่งขึ้น

trait Summary {
    fn title(&self) -> String;
    fn preview(&self) -> String {
        format!("Read more about: {}", self.title())
    }
}

struct Article { headline: String }
impl Summary for Article {
    fn title(&self) -> String { self.headline.clone() }
}

fn main() {
    let a = Article { headline: String::from("Rust Rocks") };
    println!("{}", a.preview());
}

รูปแบบเมธอดแม่แบบ

การผสมผสานระหว่างส่วนที่จำเป็นกับส่วนเริ่มต้นนี้เรียกว่า รูปแบบเมธอดแม่แบบ เทรตจะกำหนดลำดับการทำงานโดยรวมไว้ในการทำงานเริ่มต้น และปล่อยส่วนที่เปลี่ยนแปลงได้ให้เป็นเมธอดที่จำเป็น

trait Report {
    fn body(&self) -> String;
    fn render(&self) -> String {
        format!("=== REPORT ===\n{}\n==============", self.body())
    }
}

struct Sales;
impl Report for Sales {
    fn body(&self) -> String { String::from("Sales up 10%") }
}

fn main() {
    println!("{}", Sales.render());
}

การทำงานเริ่มต้นหลายรายการ

เทรตสามารถผสมเมธอดที่จำเป็นกับเมธอดเริ่มต้นได้อย่างอิสระ ชนิดที่นำไปใช้เพียงจัดเตรียมเมธอดที่จำเป็นเท่านั้น

trait Animal {
    fn name(&self) -> String;
    fn legs(&self) -> u32 { 4 }
    fn describe(&self) -> String {
        format!("{} has {} legs", self.name(), self.legs())
    }
}

struct Dog;
impl Animal for Dog {
    fn name(&self) -> String { String::from("Dog") }
}

fn main() {
    println!("{}", Dog.describe());
}

การทำงานเริ่มต้นและเทรตมาตรฐาน

เทรตมาตรฐานจำนวนมากอาศัยการทำงานเริ่มต้น ตัวอย่างเช่น Iterator ต้องการเพียง next ส่วนตัวปรับและตัวรับข้อมูลทุกชนิดล้วนเป็นเมธอดเริ่มต้นที่สร้างต่อยอดจากเมธอดนี้

นี่คือเหตุผลที่เมธอดเดียวเปิดทางให้ใช้ชุดเครื่องมือทั้งหมดได้

การเขียนทับเพื่อประสิทธิภาพ

บางครั้งการทำงานเริ่มต้นใช้ได้ แต่เวอร์ชันเฉพาะทางทำงานได้เร็วกว่า ชนิดที่นำไปใช้สามารถเขียนทับเฉพาะเมธอดนั้น และยังคงใช้การทำงานเริ่มต้นส่วนที่เหลือได้

trait Counter {
    fn items(&self) -> Vec<i32>;
    fn total(&self) -> i32 {
        self.items().iter().sum()
    }
}

struct Fast { precomputed: i32 }
impl Counter for Fast {
    fn items(&self) -> Vec<i32> { vec![] }
    fn total(&self) -> i32 { self.precomputed }
}

fn main() {
    println!("{}", Fast { precomputed: 99 }.total());
}

การทำให้เทรตใช้งานสะดวก

การออกแบบเทรตที่ดีคือ กำหนดเมธอดที่จำเป็นเพียงชุดเล็ก ๆ และจัดเตรียมการทำงานเริ่มต้นที่สะดวกสำหรับส่วนที่เหลือ ชนิดที่นำไปใช้จึงทำงานเพียงเล็กน้อย แต่ได้ส่วนเชื่อมต่อที่มีความสามารถครบถ้วน

ข้อควรระวัง

เมธอดเริ่มต้นสามารถใช้ได้เฉพาะเมธอดอื่นของเทรตและชนิดที่อยู่เบื้องหลัง self ผ่านเมธอดเหล่านั้นเท่านั้น ไม่สามารถเข้าถึงฟิลด์ของชนิดที่นำเทรตไปใช้ซึ่งไม่ทราบชนิดได้โดยตรง ควรออกแบบการทำงานเริ่มต้นโดยอาศัยเมธอดของเทรตเอง

การทำงานเริ่มต้นเทียบกับเมธอดที่จำเป็นโดยสรุป

เมธอดของเทรตที่มีส่วนเนื้อหาคือ การทำงานเริ่มต้น ส่วนเมธอดที่มีเพียงลายเซ็นคือ เมธอดที่จำเป็น ชนิดที่นำไปใช้ต้องจัดเตรียมเมธอดที่จำเป็นทุกเมธอด แต่สามารถปล่อยการทำงานเริ่มต้นไว้โดยไม่เปลี่ยนแปลงได้

trait Logger {
    fn line(&self) -> String;
    fn log(&self) {
        println!("LOG: {}", self.line());
    }
}

struct App;
impl Logger for App {
    fn line(&self) -> String { String::from("started") }
}

fn main() {
    App.log();
}

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความเข้าใจของคุณเกี่ยวกับเมธอดเริ่มต้น

สรุปทบทวน

คุณได้เรียนรู้เรื่องการทำงานเริ่มต้นของเทรต:

  • เมธอดของเทรตสามารถมีส่วนเนื้อหาเป็นการทำงานเริ่มต้นได้
  • ชนิดที่นำไปใช้จะได้รับการทำงานนี้โดยไม่ต้องเขียนเพิ่ม และสามารถเขียนทับได้
  • การทำงานเริ่มต้นสามารถเรียกใช้เมธอดที่จำเป็น ซึ่งทำให้ใช้รูปแบบเมธอดแม่แบบได้
  • วิธีนี้ทำให้เทรตใช้งานสะดวก โดยมีส่วนที่จำเป็นเพียงเล็กน้อย

คำถามที่พบบ่อย

บทเรียน “เมธอดเริ่มต้น” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “เมธอดเริ่มต้น” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Learn Rust Coding ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Learn Rust Coding มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “เมธอดเริ่มต้น”

ค่าเริ่มต้นของคุณลักษณะ คุณปฏิบัติ Learn Rust Coding ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Learn Rust Coding หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Learn Rust Coding บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “เมธอดเริ่มต้น” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Learn Rust Coding นี้ได้ไหม

ได้ บทเรียน Learn Rust Coding ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การกำหนดคุณลักษณะ
  2. ออบเจ็กต์คุณลักษณะและ dyn
  3. การเรียกใช้แบบสแตติกเทียบกับแบบพลวัต
  4. เมธอดเริ่มต้น
← กลับไปที่ Learn Rust Coding