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

上述函数无法编译,比较时出现以下错误:

特征 `&u8: std::cmp::PartialEq` 不满足

我将其读为:“c是一个借来的字节,不能与常规字节进行比较”,但我一定是读错了。

Vec<u8>根据特定值拆分 a 的适当方法是什么?

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

4

1 回答 1

5

编码

您实际上没看错: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()
}

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

为什么是ca&u8而不是 a u8

如果你看一下文档上的split方法,你会发现闭包参数Vec. 在这种情况下,这意味着参数将&u8代替u8(因此在您的代码中,您实际上是在比较&u8u8Rust 不喜欢)。

为了理解为什么闭包通过借用而不是值来获取参数,请考虑如果参数被值获取会发生什么。在 的 情况下, 自执行Vec<u8>不会 有 问题. 但是,在 aa 的情况下,每个都将被移入闭包并销毁!u8CopyVec<String>String

于 2016-12-07T08:47:17.310 回答