gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:02:49 24 4
gpt4 key购买 nike

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

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

我想为两个结构实现特征,ConditionalNormalMultivariateConditionalNormal分别对标量和向量值分布建模。

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

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]
}
}

( playground )

但是,MultivariateConditionalNormal 的实现无效,因为通用 x[0]不可索引。如果我添加特征界限 std::ops::Index<usize> ConditionalNormal 的实现无效,因为标量 f64不可索引。

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

最佳答案

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

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

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

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

impl<U> Distribution<U> for MultivariateConditionalNormal
where
U: std::ops::Index<usize, Output = f64>,
{
// ...
}

Playground

关于generics - 我可以有可选的特征界限吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51398074/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com