我正在尝试实现 num_to_rug
函数,它将通用数字转换为 rug::Integer
.
(目的是调用 Rug 的素数测试,Integer::from(n).is_probably_prime
)
对于 u32
来说,这很容易做到和 u64
,如 Integer::from
为他们实现:
impl PrimeQ<u32> {
fn num_to_rug(n: u32) -> Integer {
Integer::from(n)
}
}
impl PrimeQ<u64> {
fn num_to_rug(n: u64) -> Integer {
Integer::from(n)
}
}
现在我想为任何类型实现这个函数:PrimeSieveTrait
Integer::from
实现pub trait PrimeSieveTrait:
AddAssign + SubAssign + MulAssign + DivAssign + integer::Roots + PrimInt + FromPrimitive {}
impl<T> PrimeSieveTrait for T
where T:
AddAssign + SubAssign + MulAssign + DivAssign + integer::Roots + PrimInt + FromPrimitive {}
如何修改下面的代码以便编译?impl<T: ?> PrimeQ<T> {
fn num_to_rug(n: T) -> Integer {
Integer::from(n)
}
}
最佳答案
如果你真的想使用 From<T>
trait,那么这不能表示为内联 trait bound – 你需要使用 where
子句代替:
impl<T> PrimeQ<T>
where
T: PrimeSieveTrait,
Integer: From<T>,
{
fn num_to_rug(n: T) -> Integer {
Integer::from(n)
}
}
更好的选择是使用 Into<Integer>
trait 代替,在这种情况下,您只需要 T
上的 trait bounds :impl<T: PrimeSieveTrait + Into<Integer>> PrimeQ<T> {
fn num_to_rug(n: T) -> Integer {
n.into()
}
}
(我通常也会用 where
子句来写这个,因为我觉得这样更易读。)更一般地,特征绑定(bind)
U: From<T>
暗示 T: Into<U>
因为一个 blanket implementation in the standard library .这意味着使用 trait bound T: Into<U>
如上面的第二个代码片段使您的函数更通用,并且使用起来也更方便,因此应该优先于 From
特质绑定(bind)。
关于generics - Rust 实现功能只要 `Integer::from` 有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64171172/