【问题标题】:How can I simplify multiple uses of BigInt::from()?如何简化 BigInt::from() 的多次使用?
【发布时间】:2019-12-13 20:35:23
【问题描述】:

我编写了一个程序,在其中我操作了很多 BigIntBigUint 值并执行一些算术运算。

我在经常使用BigInt::from(Xu8) 的地方生成了代码,因为无法直接添加不同类型的数字(如果我理解正确的话)。

我想减少代码中BigInt::from 的数量。我想过一个函数来“包装”这个,但我需要一个函数来处理我想转换成BigInt/BigUint的每种类型:

fn short_name(n: X) -> BigInt {
    return BigInt::from(n)
}

X 将是我要转换的每种类型。

我找不到任何与 Rust 的静态类型哲学不矛盾的解决方案。

我觉得我缺少一些关于特质的东西,但我对它们不太满意,而且我没有找到使用它们的解决方案。

我在尝试做一些在 Rust 中不可能的事情吗?我错过了一个明显的解决方案吗?

【问题讨论】:

  • 顺便说一句,我认为问题的标题太准确了,我不知道如何写得足够笼统以涵盖类似的问题,如果你们有更好的主意:)

标签: rust


【解决方案1】:

回答这部分:

我在经常使用BigInt::from(Xu8) 的地方生成了代码,因为无法直接添加不同类型的数字(如果我理解正确的话)。

相反,如果您查看BigInt 的文档,您会看到很多impl Add

impl<'a> Add<BigInt> for &'a u64
impl Add<u8> for BigInt

等等。第一个允许调用a_ref_to_u64 + a_bigint,第二个允许调用a_bigint + an_u8(并且都将OutputType 设置为BigInt)。在添加它们之前,您不需要将这些类型转换为BigInt!如果您希望您的方法处理任何此类类型,您只需要一个类似于From 绑定in Frxstrem's answerAdd 绑定。当然,如果你想要很多这样的操作,From 最终可能会更具可读性。

【讨论】:

  • 我确实错了,感谢您纠正我并解释错误:)
【解决方案2】:

From&lt;T&gt; 特征(以及互补的 Into&lt;T&gt; 特征)通常用于在 Rust 中类型之间进行转换。事实上,BigInt::from 方法来自于From trait。

您可以将short_name 函数修改为带有where 子句的泛型函数,以接受BigInt 可以转换的所有类型:

fn short_name<T>(n: T) -> BigInt // function with generic type T
where
    BigInt: From<T>, // where BigInt implements the From<T> trait
{
    BigInt::from(n)
}

【讨论】:

  • T: Into&lt;BigInt&gt; 是一个比BigInt: From&lt;T&gt; 更宽松的约束条件,尽管它不太可能产生太多的不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-03
  • 1970-01-01
  • 2022-08-09
  • 1970-01-01
  • 1970-01-01
  • 2018-03-06
  • 1970-01-01
相关资源
最近更新 更多