Learn Rust Coding · บทเรียน

การกำหนดคุณลักษณะ

พฤติกรรมร่วมกัน

บทเรียน 1 จาก 413 ขั้นตอน

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

เทรตคืออะไร

เทรตกำหนดพฤติกรรมร่วมกัน ซึ่งเป็นชุดเมธอดที่ชนิดข้อมูลสามารถนำไปใช้ได้ แนวคิดนี้คล้ายกับอินเทอร์เฟซในภาษาอื่น

เทรตทำให้ชนิดข้อมูลต่าง ๆ ยอมรับข้อตกลงร่วมกันได้

ประกาศเทรต

ใช้คีย์เวิร์ด trait ตามด้วยลายเซ็นของเมธอด ลายเซ็นเหล่านี้จะประกาศสิ่งที่ชนิดข้อมูลที่นำเทรตไปใช้ต้องจัดเตรียม

trait Greet {
    fn hello(&self) -> String;
}

fn main() {
    println!("trait declared");
}

นำเทรตไปใช้

ใช้ impl TraitName for Type เพื่อจัดเตรียมเมธอด ลายเซ็นต้องตรงกับเทรตทุกประการ

trait Greet {
    fn hello(&self) -> String;
}

struct Dog;

impl Greet for Dog {
    fn hello(&self) -> String {
        String::from("Woof")
    }
}

fn main() {
    let d = Dog;
    println!("{}", d.hello());
}

หลายชนิดข้อมูล หนึ่งเทรต

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

trait Greet { fn hello(&self) -> String; }

struct Dog;
struct Cat;

impl Greet for Dog { fn hello(&self) -> String { String::from("Woof") } }
impl Greet for Cat { fn hello(&self) -> String { String::from("Meow") } }

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

เทรตเป็นพารามิเตอร์ฟังก์ชัน

ไวยากรณ์ impl Trait รับชนิดข้อมูลใดก็ได้ที่นำเทรตนั้นไปใช้ ฟังก์ชันจึงทำงานในลักษณะเดียวกันโดยไม่ต้องรู้ชนิดข้อมูลจริง

trait Greet { fn hello(&self) -> String; }
struct Dog;
impl Greet for Dog { fn hello(&self) -> String { String::from("Woof") } }

fn announce(g: &impl Greet) {
    println!("It says: {}", g.hello());
}

fn main() {
    announce(&Dog);
}

ข้อกำหนดเทรตสำหรับชนิดข้อมูลทั่วไป

คุณสามารถกำหนดให้ชนิดข้อมูลทั่วไปต้องนำเทรตไปใช้ โดยใช้ ข้อกำหนดเทรต วิธีนี้ทำให้สามารถใช้เมธอดของเทรตภายในฟังก์ชันได้

trait Greet { fn hello(&self) -> String; }
struct Cat;
impl Greet for Cat { fn hello(&self) -> String { String::from("Meow") } }

fn shout<T: Greet>(g: &T) {
    println!("{}!", g.hello().to_uppercase());
}

fn main() {
    shout(&Cat);
}

ข้อกำหนดหลายรายการด้วย +

กำหนดให้ต้องมีหลายเทรตพร้อมกันด้วย + ในที่นี้ค่าหนึ่งค่าต้องนำทั้งเทรตที่กำหนดเองและ Clone มาตรฐานไปใช้

trait Named { fn name(&self) -> String; }

#[derive(Clone)]
struct Item { label: String }

impl Named for Item {
    fn name(&self) -> String { self.label.clone() }
}

fn describe<T: Named + Clone>(t: &T) {
    let copy = t.clone();
    println!("named {}", copy.name());
}

fn main() {
    describe(&Item { label: String::from("box") });
}

อนุประโยค where

เมื่อมีข้อกำหนดหลายรายการ อนุประโยค where จะช่วยให้ลายเซ็นอ่านง่ายขึ้น โดยย้ายเงื่อนไขไปไว้ด้านล่าง

use std::fmt::Debug;

fn print_all<T>(items: &[T])
where
    T: Debug,
{
    for it in items {
        println!("{:?}", it);
    }
}

fn main() {
    print_all(&[1, 2, 3]);
}

เทรตมีได้หลายเมธอด

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

trait Shape {
    fn area(&self) -> f64;
    fn name(&self) -> String;
}

struct Square { side: f64 }

impl Shape for Square {
    fn area(&self) -> f64 { self.side * self.side }
    fn name(&self) -> String { String::from("square") }
}

fn main() {
    let s = Square { side: 3.0 };
    println!("{} area {}", s.name(), s.area());
}

เหตุใดเทรตจึงสำคัญ

เทรตทำให้เกิดพหุรูปแบบได้โดยไม่ต้องสืบทอด เทรตเป็นพื้นฐานของชนิดข้อมูลทั่วไป การโอเวอร์โหลดตัวดำเนินการ (Add) การจัดรูปแบบ (Display) และส่วนสำคัญอีกมากของไลบรารีมาตรฐาน

เทรตคือหัวใจของรูปแบบนามธรรมใน Rust

กฎความสอดคล้อง

กฎผู้ไม่มีเจ้าของระบุว่าคุณจะนำเทรตไปใช้กับชนิดข้อมูลได้ก็ต่อเมื่อคุณเป็นเจ้าของเทรตหรือชนิดข้อมูลนั้น กฎนี้ป้องกันการนำไปใช้ที่ขัดแย้งกันระหว่างแครต

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

ทดสอบความเข้าใจเรื่องเทรตของคุณ

ทบทวน

คุณได้เรียนรู้การกำหนดและใช้เทรตแล้ว:

  • trait ประกาศพฤติกรรมร่วมกัน
  • impl Trait for Type จัดเตรียมเมธอด
  • ข้อกำหนดเทรต (T: Trait, +, where) ใช้จำกัดชนิดข้อมูลทั่วไป
  • กฎผู้ไม่มีเจ้าของช่วยให้การนำเทรตไปใช้มีความสอดคล้องกัน
เริ่มต้นได้ฟรี

เรียนรู้ Rust ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
39
บทเรียน
144

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

บทเรียน “การกำหนดคุณลักษณะ” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การกำหนดคุณลักษณะ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ 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 ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “การกำหนดคุณลักษณะ” ใช้เวลานานแค่ไหน

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

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

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

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

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