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