Rust 类型不匹配错误:应为'char',找到引用

Rust 类型不匹配错误:应为'char',找到引用,rust,iterator,closures,Rust,Iterator,Closures,代码片段是: 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.contain

代码片段是:

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

}
不确定为什么&x不能推断为&char,我提到的链接是:


谢谢

事实上,我只是去了生锈的操场,按照我的建议做了:首先,我把&从你的|&x |中移除了。然后编译器抱怨containsx不是一个引用,所以我添加了一个&there:

使用std::collections::HashSet; fn干线{ 让dna=String::fromACCCX; 让dict:HashSet=vec!['A'、'C'、'G'、'T'])进入收集; println!{},dna.chars.all | x | dict.contains&x; }
编译并打印为false,因为X不在散列集中。

事实上,我只是去了Rust游乐场,并按照我的建议做了:首先,我从你的|&X |中删除了&。然后编译器抱怨containsx不是一个引用,所以我添加了一个&there:

使用std::collections::HashSet; fn干线{ 让dna=String::fromACCCX; 让dict:HashSet=vec!['A'、'C'、'G'、'T'])进入收集; println!{},dna.chars.all | x | dict.contains&x; }
编译并打印为false,因为X不在散列集中。

错误消息有点混乱,本质上是向后的

dna.chars().all(|&x| dict.contains(x)));
String::chars返回一个char,而不是&char,HashSet::contains需要一个对其包含的类型的引用,so&char。但是,closure |&x | dict.containsx需要对某些类型的引用。 这有点令人困惑,但函数参数中的&argument_name实质上是对传入参数执行模式匹配,取消对它的引用。这与为闭包编写| a,b |是一样的,闭包接受一个两元素元组并立即将其分解为两个变量。
因此,消息应该是预期的引用&,found char。

错误消息有点混乱,本质上是向后的

dna.chars().all(|&x| dict.contains(x)));
String::chars返回一个char,而不是&char,HashSet::contains需要一个对其包含的类型的引用,so&char。但是,closure |&x | dict.containsx需要对某些类型的引用。 这有点令人困惑,但函数参数中的&argument_name实质上是对传入参数执行模式匹配,取消对它的引用。这与为闭包编写| a,b |是一样的,闭包接受一个两元素元组并立即将其分解为两个变量。
因此,真正的消息应该是reference&,found char。

我刚刚开始学习Rust,但我的方法是尝试一系列排列,将&。试着只用| x |。尝试在x参数前面添加一个。尝试两者兼得…@Lagerber在symbol soup中挥舞可以让你的代码得到编译,尽管理解为什么一种方法有效,另一种方法不能阻止你在未来挥舞。我刚刚开始学习生锈,但我在这里的方法是尝试将&放在哪里的一系列排列。试着只用| x |。尝试在x参数前面添加一个。尝试两者兼得…@Lagerber在symbol soup中挥舞可以让你的代码得到编译,尽管理解为什么一种方法有效,而另一种方法不能阻止你在未来挥舞。谢谢你的回复,也请找到它。另外,发现另一个非常有趣的例子:。如果同时从|&x |中删除&from,那么现在编译器将再次大叫,因为此时它需要|&x |。我可以按照错误消息进行调整,但在闭包时它应该是| x |,什么时候是|&x |?我愿意讨论和讨论enlightenment@OtterMan不同之处在于,一个生成values.chars->char,而另一个生成references.iter->&T和| x |都可以,只要您在闭包中正确使用char/&T。谢谢您的回复,也可以找到它。另外,发现另一个非常有趣的例子:。如果同时从|&x |中删除&from,那么现在编译器将再次大叫,因为此时它需要|&x |。我可以按照错误消息进行调整,但在闭包时它应该是| x |,什么时候是|&x |?我愿意讨论和讨论enlightenment@OtterMan不同之处在于,一个生成value.chars->char,而另一个生成references.iter->&T和| x |都可以,只要您在闭包中正确使用char/&T。谢谢您的回复!谢谢你的回复!