首页 > 解决方案 > 不匹配的类型错误:预期的 `char`,找到参考

问题描述

代码片段是:

use std::collections::HashSet;
  
fn main() {
    let dna = String::from("ACCCX");
    let dict: HashSet<char> = vec!['A', 'C', 'G', 'T'].into_iter().collect();
    println!("{}", dna.chars().all(|&x| dict.contains(x)));

}

编译中显示的错误是:

error[E0308]: mismatched types
 --> src/main.rs:6:37
  |
6 |     println!("{}", dna.chars().all(|&x| dict.contains(x)));
  |                                     ^--
  |                                     ||
  |                                     |expected due to this
  |                                     expected `char`, found reference
  |                                     help: did you mean `x`: `&char`
  |
  = note:   expected type `char`
          found reference `&_`

不知道为什么&x不能推断&char和我提到的链接是:

  1. https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.all
  2. https://doc.rust-lang.org/std/collections/struct.HashSet.html#method.contains

谢谢!

标签: rustiteratorclosures

解决方案


错误消息有点令人困惑,本质上它是倒退的。

dna.chars().all(|&x| dict.contains(x)));

String::chars 返回 a char, not &char,而 HashSet::contains 期望引用它包含的类型,所以&char. 但是,闭包|&x| dict.contains(x)期望引用某种类型。
这有点令人困惑,但&argument_name在函数参数中基本上对传入参数执行模式匹配,取消引用它。这与编写|(a, b)|一个带有两个元素元组并立即将其解构为两个变量的闭包相同。
所以真正的信息应该是Expected reference &_, found char


推荐阅读