这就是我所拥有的:
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类型(这是我们的特点)?
发布于 2017-04-29 20:43:00
当您有类型参数时,调用方将决定它的类型。然而,当T是None时,您试图强迫activation成为None。然而,调用者可以用MainStruct::new调用None::<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特性。( is in the prelude,所以您不需要导入它就可以调用MainStruct::default()。)
impl Default for MainStruct<Sigmoid> {
fn default() -> MainStruct<Sigmoid> {
Self::new(Sigmoid {})
}
}https://stackoverflow.com/questions/43699551
复制相似问题