首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >闭包:期望u32找到类型参数

闭包:期望u32找到类型参数
EN

Stack Overflow用户
提问于 2020-11-29 17:50:30
回答 1查看 94关注 0票数 2

问题是,我的泛型类型T只接受来自u32的参数,在本例中,我试图传递一个存储在U中的泛型值。

是否有方法将泛型转换为特定类型?我能做些什么来解决这个问题?

代码语言:javascript
复制
#[derive(Debug)]
struct Cacher<T, U> where T: Fn(u32) -> u32 {
    calcular:T,
    valor:Option<U>,
}
impl<T, U> Cacher<T, U> where T: Fn(u32) -> u32 {
    fn nuevo(calcular:T, valor:U) -> Cacher<T, U> {
        Cacher{
            calcular,
            valor:None,
        }
    }
    fn valor(&mut self, arg:U) -> u32 {
        match self.valor {
            Some(v) => v,
            None => {
                let v = (self.calcular)(arg);
                self.valor = Some(arg);
                v
            }
        }
    }
}

fn generar(intensidad:u32){
    let mut resultado = Cacher::nuevo(|num| {
        println!("Trabajando");
        num
    },None);

    let res_a = resultado.valor(Some(4));
}

fn main() {
    generar(3);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-29 18:06:10

要么从实现中删除泛型类型参数U,并且只使用u32的:

代码语言:javascript
复制
#[derive(Debug)]
struct Cacher<T>
    where T: Fn(u32) -> u32 
{
    calcular: T,
    valor: Option<u32>,
}

impl<T> Cacher<T>
    where T: Fn(u32) -> u32
{
    fn nuevo(calcular: T) -> Cacher<T> {
        Cacher {
            calcular,
            valor: None,
        }
    }

    fn valor(&mut self, arg: u32) -> u32 {
        match self.valor {
            Some(v) => v,
            None => {
                let v = (self.calcular)(arg);
                self.valor = Some(arg);
                v
            }
        }
    }
}

fn main() {
    let mut resultado = Cacher::nuevo(|num| {
        println!("Trabajando");
        num
    });

    // "Trabajando" only printed once
    // hence we know we got a cache hit
    let res_a = resultado.valor(4);
    let res_a = resultado.valor(4);
    

    println!("{:?}", res_a);
}

游乐场

或者使您的实现完全-泛型:

代码语言:javascript
复制
#[derive(Debug)]
struct Cacher<T, U>
    where T: Fn(U) -> U, U: Copy
{
    calcular: T,
    valor: Option<U>,
}

impl<T, U> Cacher<T, U>
    where T: Fn(U) -> U, U: Copy
{
    fn nuevo(calcular: T) -> Cacher<T, U> {
        Cacher {
            calcular,
            valor: None,
        }
    }

    fn valor(&mut self, arg: U) -> U {
        match self.valor {
            Some(v) => v,
            None => {
                let v = (self.calcular)(arg);
                self.valor = Some(arg);
                v
            }
        }
    }
}

fn main() {
    let mut resultado = Cacher::nuevo(|num| {
        println!("Trabajando");
        num
    });

    // "Trabajando" only printed once
    // hence we know we got a cache hit
    let res_a = resultado.valor(4);
    let res_a = resultado.valor(4);
    

    println!("{:?}", res_a);
}

游乐场

上面的实现将适用于实现Copy的任何Copy,因此包括所有的数字原语,例如u8u16等。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65063235

复制
相关文章

相似问题

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