gpt4 book ai didi

function - 如何在 Rust 的函数和模式匹配中使用泛型?

转载 作者:行者123 更新时间:2023-11-29 08:26:08 26 4
gpt4 key购买 nike

我正在解决一个叫做 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(),
}
}

它不编译,模式匹配不喜欢这样。我是 Rust 的新手,我试图了解是否可以使用泛型类型创建一个函数来解决这个仅以 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()每一个数值常数

可以找到工作版本here

关于function - 如何在 Rust 的函数和模式匹配中使用泛型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57943635/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com