【问题标题】:Why is the inference of a generic type not "transitive"?为什么泛型类型的推断不是“传递的”?
【发布时间】:2018-10-15 15:04:03
【问题描述】:

当我尝试编译这段代码时:

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&lt;T&gt; 实现 Borrow&lt;[T]&gt;
  • [T, 3] 实现 Borrow&lt;[T]&gt;
  • [T] 实现 PartialEq&lt;[T]&gt;

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

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

为什么这段代码编译失败?

【问题讨论】:

    标签: generics rust type-inference


    【解决方案1】:

    E0283

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-11
      • 2014-02-04
      • 2021-12-21
      相关资源
      最近更新 更多