我可以有可选的特征界限吗?

The*_*son 4 generics rust

给定一个模拟条件概率分布的特征:

trait Distribution {
    type T;
    fn sample<U>(&self, x: U) -> Self::T;
}
Run Code Online (Sandbox Code Playgroud)

我想实现两个结构的特征,ConditionalNormal分别MultivariateConditionalNormal对标量和向量值分布进行建模。

这样的实现看起来像这样:

struct ConditionalNormal;

impl Distribution for ConditionalNormal {
    type T = f64;

    fn sample<U>(&self, x: U) -> Self::T {
        0.0
    }
}

struct MultivariateConditionalNormal;

impl Distribution for MultivariateConditionalNormal {
    type T = f64;

    fn sample<U>(&self, x: U) -> Self::T {
        0.0 + x[0]
    }
}
Run Code Online (Sandbox Code Playgroud)

游乐场

然而, 的实现MultivariateConditionalNormal是无效的,因为泛型x[0]不可索引。如果我添加特征边界,std::ops::Index<usize>则实现ConditionalNormal无效,因为标量f64不可索引。

我听说,例如,该Sized特征通过 ; 接受可选特征边界?Sized;我可以做类似的事情吗?有什么办法可以解决这个问题吗?

kaz*_*ase 5

您可以将特征的定义更改为

trait Distribution<U> {
    type T;
    fn sample(&self, x: U) -> Self::T;
}
Run Code Online (Sandbox Code Playgroud)

这允许您在具有不同特征边界的各种类型上实现它。

impl<U> Distribution<U> for ConditionalNormal {
    // ...
}

impl<U> Distribution<U> for MultivariateConditionalNormal
where
    U: std::ops::Index<usize, Output = f64>,
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

操场