首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在泛型类型中使用unwrap_or

在泛型类型中使用unwrap_or
EN

Stack Overflow用户
提问于 2017-04-29 19:16:29
回答 1查看 301关注 0票数 0

这就是我所拥有的:

代码语言:javascript
复制
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时分配一个默认值,但是我收到了这个错误:

代码语言:javascript
复制
expected type parameter, found struct `activation::Sigmoid`

不知道是什么问题,或者我需要告诉编译器Sigmoid实现了T类型(这是我们的特点)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-29 20:43:00

当您有类型参数时,调用方将决定它的类型。然而,当TNone时,您试图强迫activation成为None。然而,调用者可以用MainStruct::new调用None::<Widgetoid>,签名说它应该返回一个MainStruct<Widgetoid>。事实上,None不仅仅是一个常数,而且是一个常数的无穷大,每个T都是一个常数。

与在这里使用Option不同,您应该有两个不同的构造函数:一个直接接受Activation的泛型构造函数(不再使用Option ),另一个默认构造函数不接受参数。

代码语言:javascript
复制
// 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()。)

代码语言:javascript
复制
impl Default for MainStruct<Sigmoid> {
    fn default() -> MainStruct<Sigmoid> {
        Self::new(Sigmoid {})
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43699551

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档