การกำหนดคุณลักษณะ
พฤติกรรมร่วมกัน
การกำหนดคุณลักษณะ เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ