【问题标题】:Cannot compare &u8 with u8无法将 &u8 与 u8 进行比较
【发布时间】:2016-12-07 08:45:49
【问题描述】:
fn count_spaces(text: Vec<u8>) -> usize {
    text.split(|c| c == 32u8).count()
}

上面的函数没有编译,比较时报如下错误:

trait `&u8: std::cmp::PartialEq` 不满足

我将其读为:“c 是借用字节,无法与常规字节进行比较”,但我一定是读错了。

在特定值上拆分 Vec&lt;u8&gt; 的适当方法是什么?

我确实意识到读取文件时有一些选项,例如拆分BufReader,或者我可以将向量转换为字符串并使用str::split。我可能会采用这样的解决方案(传入BufReader 而不是Vec&lt;u8&gt;),但现在我只是在玩,测试东西,想知道我做错了什么。

【问题讨论】:

    标签: vector lambda split rust borrowing


    【解决方案1】:

    代码

    您实际上没看错:c 确实是一个借来的字节,无法与常规字节进行比较。请尝试使用以下任何功能:

    fn count_spaces(text: Vec<u8>) -> usize {
        text.split(|&c| c == 32u8).count()
    }
    
    fn count_spaces(text: Vec<u8>) -> usize {
        text.split(|c| *c == 32u8).count()
    }
    

    第一个在参数上使用模式匹配 (&amp;c) 来取消引用它,而第二个使用取消引用运算符 (*)。

    为什么c&amp;u8 而不是u8

    如果您查看文档中的split 方法,您会发现闭包参数是Vec 中数据的借用。在这种情况下,这意味着参数将是 &amp;u8 而不是 u8(因此在您的代码中,您实际上是在比较 &amp;u8u8,这是 Rust 不喜欢的)。

    为了理解为什么闭包通过借用而不是值来获取参数,请考虑如果参数被值获取会发生什么。在Vec&lt;u8&gt; 的情况下,由于u8 实现了Copy,所以不会有问题。但是,在Vec&lt;String&gt; 的情况下,每个String 都会被移入闭包并销毁!

    【讨论】:

    • 谢谢!试图找到一种方法来取消引用它,但在 Rust Book 的引用和借用章节中没有提到它。应该能够猜到它与 C 中的操作符相同。自从我上次做任何 Rust 以来已经快一年了,但一直想回到它,所以我对语法有点生疏(请原谅双关语)。 :/ 我真的很喜欢提前解除引用的第一个版本。
    • 很高兴看到你回到 Rust!如果您想更密切地关注社区,请随时关注 rust subreddit 或 irc.mozilla.org 上的 #rust。
    猜你喜欢
    • 1970-01-01
    • 2017-05-01
    • 2020-10-28
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多