Generics 只要'Integer::from'有效,就可以实现该函数

Generics 只要'Integer::from'有效,就可以实现该函数,generics,rust,traits,Generics,Rust,Traits,我正在尝试实现一个num\u to\u rug函数,它将一个通用数字转换为rug::Integer (目的是调用Rug的素性测试,Integer::from(n).is\u可能是\u prime) 这对于u32和u64来说很容易做到,因为Integer::from是为它们实现的: impl PrimeQ{ fn num到rug(n:u32)->整数{ 整数::from(n) } } impl PrimeQ{ fn num到rug(n:u64)->整数{ 整数::from(n) } } 现在,我

我正在尝试实现一个
num\u to\u rug
函数,它将一个通用数字转换为
rug::Integer

(目的是调用Rug的素性测试,
Integer::from(n).is\u可能是\u prime

这对于
u32
u64
来说很容易做到,因为
Integer::from
是为它们实现的:

impl PrimeQ{
fn num到rug(n:u32)->整数{
整数::from(n)
}
}
impl PrimeQ{
fn num到rug(n:u64)->整数{
整数::from(n)
}
}
现在,我想为以下任何类型实现此函数:

  • 满足我自己的
    primesivetrait
  • 已实施
    Integer::from
pub-PrimeSieveTrait:
AddAssign+SubAssign+MulAssign+DivAssign+integer::root+primit+FromPrimitive{}
针对T的impl PRIME SIVEETRAIT
其中T:
AddAssign+SubAssign+MulAssign+DivAssign+integer::root+primit+FromPrimitive{}
如何修改下面的代码以使其编译

impl PrimeQ{
fn num_to_rug(n:T)->整数{
整数::from(n)
}
}

如果您确实想使用
From
特征,那么这不能表示为内联特征绑定–您需要使用
where
子句:

impl<T> PrimeQ<T>
where
    T: PrimeSieveTrait,
    Integer: From<T>,
{
    fn num_to_rug(n: T) -> Integer {
        Integer::from(n)
    }
}
(我通常会用
where
子句来写这篇文章,因为我发现它更可读。)


更一般地说,特质绑定的
U:From
意味着
T:Into
,因为a。这意味着在上面的第二个代码片段中使用trait-bound
T:Into
会使函数更通用,使用起来也更方便,因此它应该优先于
From
trait-bound。

如果您确实想使用
From
trait,那么这不能表示为内联特征绑定–您需要使用
where
子句:

impl<T> PrimeQ<T>
where
    T: PrimeSieveTrait,
    Integer: From<T>,
{
    fn num_to_rug(n: T) -> Integer {
        Integer::from(n)
    }
}
(我通常会用
where
子句来写这篇文章,因为我发现它更可读。)


更一般地说,特质绑定的
U:From
意味着
T:Into
,因为a。这意味着在上面的第二个代码段中使用trait-bound
T:Into
可以使函数更通用,使用起来也更方便,因此它应该优先于
From
trait-bound。

尽管使用
Into
不允许内联绑定吗?更新了答案,代码现在甚至已经过测试。:)正如在文档中所说的,在定义消费者时,您应该更倾向于使用特征<在泛型函数上指定特征边界时,代码>更喜欢使用Into而不是From,以确保只能实现Into的类型也可以使用。请在回答中提及这一点。虽然在中使用
不允许内联绑定吗?更新了答案,代码现在甚至已经过测试了。:)正如在文档中所说的,在定义消费者时,您应该更倾向于使用特征<在泛型函数上指定特征边界时,代码>更喜欢使用Into而不是From,以确保只能实现Into的类型也可以使用。
请在回答中提及这一点。