【问题标题】:Mismatched types error: expected `char`, found reference不匹配的类型错误:预期的 `char`,找到参考
【发布时间】:2020-12-31 22:43:32
【问题描述】:

代码sn-p是:

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 `&_`

不知道为什么&amp;x不能被推断为&amp;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

谢谢!

【问题讨论】:

  • 我刚开始学习 Rust,但我的方法是尝试一堆排列 &amp; 的位置。尝试只使用|x|。尝试在 x 参数前添加一个。尝试两者都有...
  • @Lagerbaer 在符号汤中到处乱窜可能是让您的代码编译的一种方法,但了解为什么一种方法有效而另一种方法并不能阻止您在未来乱窜。

标签: rust iterator closures


【解决方案1】:

错误信息有点混乱,本质上是倒退的。

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

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

【讨论】:

    【解决方案2】:

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

    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 不在哈希集中。

    【讨论】:

    • 感谢您的回复,也找到了。另外,找到另一个非常有趣的例子:doc.rust-lang.org/std/iter/trait.Iterator.html#examples-34。如果您还从|&amp;x| 中删除了&amp;,现在编译器将再次大喊,因为这次它需要|&amp;x|。我可以按照错误消息进行调整,但是在关闭时它应该是|x|,而|&amp;x| 是什么时候?我愿意讨论和启发
    • @OtterMan 不同之处在于一个产生values .chars() -> char,而另一个产生references .iter() -> &amp;T。只要您在闭包内正确使用char/&amp;T|x| 将适用于两者
    猜你喜欢
    • 2021-10-10
    • 1970-01-01
    • 2018-01-31
    • 2016-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多