ตัวอย่างง่ายๆสำหรับgeneric parameters of trait function:

trait Ext: Sized {
    fn then<R>(self, f: fn(Self) -> R) -> R {
        f(self)
    }
}

impl<T> Ext for T {}

ตัวอย่างง่ายๆสำหรับgeneric parameters of trait:

trait Ext<R>: Sized {
    fn then(self, f: fn(Self) -> R) -> R {
        f(self)
    }
}

impl<T, R> Ext<R> for T {}

อะไรคือความแตกต่างระหว่างทั้งสอง?

เมื่อใดฉันควรใช้ "พารามิเตอร์ทั่วไปของฟังก์ชันลักษณะ" และเมื่อใดฉันควรใช้ "พารามิเตอร์ทั่วไปของคุณลักษณะ"

ตอบ

หากคุณใช้พารามิเตอร์ทั่วไปกับคุณลักษณะ ค่าเดียวกันจะต้องนำไปใช้กับฟังก์ชันทั้งหมดในการใช้งานคุณลักษณะ แทนที่จะใช้กับแต่ละฟังก์ชันเท่านั้น แต่คุณจะต้องระบุพารามิเตอร์ทุกครั้งที่อ้างอิงคุณลักษณะนั้นด้วย

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

impl Ext<String> for Something { }
impl Ext<u32> for Something { }

นอกจากนี้ยังสามารถจำกัดประเภทตามพารามิเตอร์ลักษณะได้ ตัวอย่างเช่น สำหรับ Mul trait:

pub trait Mul<Rhs = Self> {
    type Output;
    pub fn mul(self, rhs: Rhs) -> Self::Output;
}

การใช้งานสำหรับประเภทเฉพาะจะเป็นตัวกำหนดประเภทของ Self และต้องระบุ Self::Output (ซึ่งไม่จำเป็นต้องเหมือนกับประเภท) พารามิเตอร์ trait ที่นี่ทำให้มั่นใจว่าประเภทของrhsเหมือนกับ Self