gpt4 book ai didi

rust - 将 unwrap_or 与泛型一起使用

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

这是我的:

use activation::Activation;
use activation::Sigmoid;

pub struct MainStruct<T> {
activation: T
}

impl<T: Activation> MainStruct<T> {
pub fn new(activation: Option<T>) -> MainStruct<T>
where T: Activation
{
// default
let activation_fn = activation.unwrap_or(Sigmoid {});

MainStruct {
activation: activation_fn,
}
}
}

其中 activation::Activation 是一个特征,Sigmoid 实现了 Activation 特征。我想要做的是接受此特征作为输入,并能够在它为 None 时分配默认值,但我收到此错误:

expected type parameter, found struct `activation::Sigmoid`

不确定是什么问题,或者我可能需要以某种方式告诉编译器 Sigmoid 实现类型 T(这是我们的特征)?

最佳答案

当你有一个类型参数时,调用者决定它是什么类型。但是,您试图强制 T成为Sigmoid什么时候activationNone .然而,调用者可以调用 MainStruct::newNone::<Widgetoid> , 并且签名说它应该返回一个 MainStruct<Widgetoid> .事实上,None不只是一个常数,而是无穷多个常数,每个常数一个 T .

而不是使用 Option在这里,您应该有两个不同的构造函数:一个采用 Activation 的通用构造函数直接(不再是 Option),以及一个不带参数的默认值。

// Generic impl, generic constructor
impl<T: Activation> MainStruct<T> {
pub fn new(activation: T) -> MainStruct<T>
where T: Activation
{
MainStruct {
activation: activation,
}
}
}

// Specific impl, specific constructor
impl MainStruct<Sigmoid> {
pub fn default() -> MainStruct<Sigmoid> {
Self::new(Sigmoid {}) // delegate to generic constructor
}
}

而不是制作 default一个固有的静态方法,你可能想要实现 Default 特质代替。 ( Default is in the prelude ,因此您无需导入它即可调用 MainStruct::default() 。)

impl Default for MainStruct<Sigmoid> {
fn default() -> MainStruct<Sigmoid> {
Self::new(Sigmoid {})
}
}

关于rust - 将 unwrap_or 与泛型一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43699551/

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