为什么通用类型的推断不是"传递"?

时间:2018-05-05 06:42:44

标签: generics rust type-inference

当我尝试编译此代码时:

use std::borrow::Borrow;

fn test_eq<T, U, B>(t: T, u: U) -> bool
where
    T: Borrow<B>,
    U: Borrow<B>,
    B: PartialEq<B> + ?Sized,
{
    t.borrow() == u.borrow()
}

fn main() {
    let my_vec = vec![1, 2, 3];

    assert!(test_eq(my_vec, [1, 2, 3]));
}

我明白了:

error[E0283]: type annotations required: cannot resolve `std::vec::Vec<i32>: std::borrow::Borrow<_>`
  --> src/main.rs:15:13
   |
15 |     assert!(test_eq(my_vec, [1, 2, 3]));
   |             ^^^^^^^
   |

显然,[T]B的合适人选,因为:

  • Vec<T>实施Borrow<[T]>
  • [T, 3]实施Borrow<[T]>
  • [T]实施PartialEq<[T]>

如果我明确指定了类型,我的代码就会编译:

assert!(test_eq::<Vec<i32>, [i32; 3], [i32]>(my_vec, [1, 2, 3]));

为什么这段代码无法编译?

1 个答案:

答案 0 :(得分:3)

E0283

  

当编译器没有足够的信息来明确选择实现时,会发生此错误。

在此示例中,编译器无法推断B是切片类型[T],您至少要使用注释[_]指定该信息:

assert!(test_eq::<_, _, [_]>(my_vec, [1, 2, 3] ));