如何简化BigInt :: from()的多种用法?

时间:2019-12-13 20:35:23

标签: rust

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

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

我想减少代码中BigInt::from的数量。我想到了一个“包装”此功能的函数,但我需要将每种类型的函数转换为BigInt / BigUint

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

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

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

我觉得我对特质有些缺失,但是我对特质不是很满意,也没有找到使用特质的解决方案。

我要在Rust中做一些不可能的事情吗?我是否缺少一个明显的解决方案?

2 个答案:

答案 0 :(得分:3)

要回答这一部分:

  

我在经常使用var file = event.target.files[0]; var sliced = file.slice(0, 2048); // Pick a size that you're ok with // NOTE: `await` keyword requires transpiling (Babel) for IE11, // and to be inside an async function. An alternative is: // sliced.text().then(function(text) { console.log(text); }); var text = await sliced.text(); console.log(text); 的地方生成了代码,因为不可能直接添加不同类型的数字(如果我理解正确的话)。

相反,如果您查看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绑定(类似于Add绑定in Frxstrem's answer)即可。当然,如果您想进行许多这样的操作,From可能最终更具可读性。

答案 1 :(得分:2)

From<T>特征(和互补的Into<T>特征)通常用于在Rust中进行类型之间的转换。实际上,BigInt::from方法来自From特性。

您可以使用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)
}