< 返回版块

ilp64 发表于 2021-05-07 09:39

Tags:generic

fn sum<T: Add<Output=T> + Copy>(list: &[T]) -> T {
    if list.len() == 0 {
        0
    } else {
        list[0] + sum(&list[1..])
    }
}

if条件中返回的0和函数返回的T类型不匹配,请问大佬们这个不加参数可以解决吗?

评论区

写评论
uno 2021-05-07 13:25

如果限定数字的话,可以看看num-traits这个库

作者 ilp64 2021-05-07 10:37

谢谢大佬👍

--
👇
w: 可以补一个泛型限定。


fn sum<T: Add<Output=T> + Copy + Default>(list: &[T]) -> T {
    if list.len() == 0 {
        Default::default()
    } else {
        list[0] + sum(&list[1..])
    }
}

原代码之所以不通过的原因是只要某个类型实现了ADDCopy就可以被接收。而实现这两个trait的类型不一定是数字类型,有可能是结构体,元组。

w 2021-05-07 10:12

可以补一个泛型限定。


fn sum<T: Add<Output=T> + Copy + Default>(list: &[T]) -> T {
    if list.len() == 0 {
        Default::default()
    } else {
        list[0] + sum(&list[1..])
    }
}

原代码之所以不通过的原因是只要某个类型实现了ADDCopy就可以被接收。而实现这两个trait的类型不一定是数字类型,有可能是结构体,元组。

1 共 3 条评论, 1 页