要求通用类型的重载运算符和运算结果也应重载运算符

时间:2018-07-03 20:22:47

标签: generics types rust

我正在尝试实现一种HashSet,该类型可以存储遇到的哈希(不关联值)。

我对此有疑问:

  • 我希望该结构在实现DivRemEq(类似int)的类型上通用。
  • 要使其正常工作,我需要DivRem的输出才能实现DivRemEq(我认为)。我愿意取消不符合此条件的类型的资格。
  • 这些类型还需要与一个我不能成为动态类型的整数常量进行交互。

我尝试将其简化为一个最小的示例(playground):

use std::ops::{ Rem, Div };

const X: i32 = 16;

pub trait Int: Rem + Div + Eq + Sized {}

impl Int for i32 {}
impl Int for usize {}
// also other int types

pub fn stuff<T: Int>(arg: T) -> T {
    (arg / X) % X
}

(我还有一个更详尽的playground来展示我尝试过的内容)。

但是,尽管我理解我得到的错误,但我不知道如何解决它们:

error[E0308]: mismatched types
  --> main.rs:13:12
   |
13 |     (arg / BINS) % BINS
   |            ^^^^ expected type parameter, found i32
   |
   = note: expected type `T`
              found type `i32`

error[E0369]: binary operation `%` cannot be applied to type `<T as std::ops::Div>::Output`
  --> main.rs:13:5
   |
13 |     (arg / BINS) % BINS
   |     ^^^^^^^^^^^^^^^^^^^
   |
   = note: an implementation of `std::ops::Rem` might be missing for `<T as std::ops::Div>::Output`

夜间功能很好。

0 个答案:

没有答案