如何在Rust中注释空切片的类型?

11

假设我想在测试中将一个Vec<String>与字面意义上的空列表进行比较。

(我知道在实践中可以检查is_empty(),但我想了解Rust类型系统在这里的工作原理,并且我认为如果失败的话,断言相等性会给出更清晰的信息。)

如果我只是这样说:

    let a: Vec<String> = Vec::new();
    assert_eq!(a, []);

收到了一个错误

error[E0282]: type annotations needed
 --> src/main.rs:3:5
  |
3 |     assert_eq!(a, []);
  |     ^^^^^^^^^^^^^^^^^^ cannot infer type
  |
  = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)

我认为问题在于rustc无法确定我是指String的空列表,还是&str的空列表,或者其他什么?

我如何将所需的类型注释添加到[]字面值中?

这取决于尚未稳定的类型注释功能,还是有一种稳定的方法来指定这个?

1个回答

12
今天一个行之有效的方法是使用as语法同时指定类型和长度:

works的一种方法是使用as语法同时指定类型和长度:

assert_eq!(a, [] as [&str; 0]);

3
我可能会更快地到达以下解决方法,但它感觉“不太纯粹”,因为我们提到了一个未使用的值:[""; 0] - ramslök

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接