“特征函数的通用参数”和“特征的通用参数”有什么区别?

hzq*_*elf 5 generics rust

一个简单的例子generic parameters of trait function

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

impl<T> Ext for T {}
Run Code Online (Sandbox Code Playgroud)

一个简单的例子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 {}
Run Code Online (Sandbox Code Playgroud)

两者有什么区别?

什么时候应该使用“特征函数的通用参数”,什么时候应该使用“特征的通用参数”?

tra*_*tor 4

如果您在特征上使用通用参数,则相同的值必须应用于特征实现中的所有函数,而不是仅应用于每个函数,但每当引用该特征时,您还必须指定参数。

这样做的一个优点是,您可以为该特征参数的特定值实现特征,其中每个实现都是独立的:

impl Ext<String> for Something { }
impl Ext<u32> for Something { }
Run Code Online (Sandbox Code Playgroud)

还可以根据特征参数限制类型。例如,对于 Mul 特征:

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

特定类型的实现将确定 Self 的类型,并且它必须指定 Self::Output (不必与类型相同)。这里的trait参数是保证与Self的类型rhs相同