繁体   English   中英

不匹配的类型错误:预期的 `char`,找到参考

[英]Mismatched types error: expected `char`, found reference

代码片段是:

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

谢谢!

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

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

String::chars 返回一个char ,而不是&char ,并且 HashSet::contains 期望引用它包含的类型,所以&char 然而,关闭|&x| dict.contains(x) |&x| dict.contains(x)期望引用某种类型。
这有点令人困惑,但是 function 参数中的&argument_name本质上是对传入参数执行模式匹配,取消引用它。 和写成|(a, b)|一样对于一个接受两个元素元组并立即将其解构为两个变量的闭包。
所以真正的消息应该是Expected reference &_, found char

实际上我只是去了 Rust 操场并按照我的建议做了:首先我从你的|&x|中删除了& . 然后编译器抱怨contains(x)不是引用,所以我在那里添加了&

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)));

}

这会编译并打印“false”,因为 X 不在 hash 集中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM