一个简单的例子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)
两者有什么区别?
什么时候应该使用“特征函数的通用参数”,什么时候应该使用“特征的通用参数”?
如果您在特征上使用通用参数,则相同的值必须应用于特征实现中的所有函数,而不是仅应用于每个函数,但每当引用该特征时,您还必须指定参数。
这样做的一个优点是,您可以为该特征参数的特定值实现特征,其中每个实现都是独立的:
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相同