繁体   English   中英

如何在泛型中使用泛型并在rust中进行模式匹配?

[英]how to use Generics in functions and pattern matching in rust?

我正在解决一个名为Syracuse问题(3n + 1问题)的数学问题。

我想让我的函数适用于2种类型,一种是u64,另一种是通过包含2个我称为U128的u64来扩展u64大小的结构。

我的u64函数看起来像这样

fn syracuse(n: u64) -> u64 {
    match n % 2 {
        0 => n / 2,
        1 => 3 * n + 1,
        _ => 1,
    }
}

我试过对U128和u64实施特征。

fn syracuse<T>(n: T) -> T where T : Add +Mul+Div+Rem + Basic0123 {
    match n % Basic0123::two() {
        Basic0123::zero() => n / Basic0123::two(),
        Basic0123::one() => Basic0123::three() * n + Basic0123::one(),
        _ => Basic0123::one(),
    }
}

它不编译,模式匹配不喜欢这样。 我是锈病新手,我想了解一下是否可以用通用类型创建函数来解决这个仅以DRY方式处理2种不同类型的问题,还是我应该坚持简单地为U128类型重写函数?

我只是假设注释中的大多数内容已经处理完毕,您将返回使用std::u128基本类型而不是您自己的类型。

在泛型上实现Syracuse猜想的正确方法如下:

fn syracuse<T>(n: T) -> T
    where T : Copy + Eq + Add<Output = T> + Mul<Output = T> + Div<Output = T> + Rem<Output = T> + From<u32> {

    let zero:T = 0.into();
    match n % 2.into() == zero {
        true => n/(2.into()),
        false => n * (3.into()) + 1.into()
    }
}

按出场顺序:

  • Copy ,因为我们并没有要求必须Rem&T ,但T
  • 所有Output类型规范都是这样,因此我们不会隐式更改类型T上的操作将始终映射到T
  • 我们需要Eq所以我们可以比较余数的结果
  • 我们需要From<u32>所以我们可以将into()每个数字常量

工作版本可以在这里找到

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM