如何解决不匹配的类型错误:预期的`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
,我提到的链接是:
- https://doc.rust-lang.org/std/iter/trait.Iterator.html#method.all
- 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)
需要对某种类型的引用。
这有点令人困惑,但函数参数中的 &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 不在哈希集中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。