generics - Rust 实现功能只要 `Integer::from` 有效

标签 generics rust traits

我正在尝试实现 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/

    相关文章:

    java - Apache Avro 框架可以在序列化期间处理参数化类型吗?

    java - 是否可以创建一个适用于 Java 中不同类的泛型方法?

    pointers - 借用泛型时无法移出借用的内容

    scala - "apply"在 Scala 的伴生对象(带有 Trait)中如何工作?

    java - 如何传递 `Class<T>` 的 `List<MyDevice>` ?

    c# - typeof 为未构造的嵌套泛型提供异常 'Type expected`

    rust - 无法写入文件而不附加到文件

    rust - 这是 !Sync 类型声音的包装器吗?

    rust - 为什么我要在特征上而不是作为特征的一部分来实现方法?

    python - TabularAdapter 列的不同格式?