我是 Rust 的新手,观察到一些我无法反驳的东西。
当我写
fn main() {
('a'..'z').all(|_| true);
}
Run Code Online (Sandbox Code Playgroud)
编译器报错:
fn main() {
('a'..'z').all(|_| true);
}
Run Code Online (Sandbox Code Playgroud)
当我把它改成
fn main() {
(b'a'..b'z').all(|_| true);
}
Run Code Online (Sandbox Code Playgroud)
它编译。
这里发生了什么事?Rust 是什么意思the method ... exists but the following trait bounds were not satisfied?
Sve*_*ach 12
该方法all()是特征的方法Iterator,因此您只能在实现该特征的类型上调用它。该类型Range<char>没有实现Iteratortrait,因为在一般情况下,Unicode 字符的范围没有明确定义。一组有效的 Unicode 代码点存在差距,构建一系列代码点通常不被认为是有用的。Range<u8>另一个类型确实实现了Iterator,因为在一个字节范围内迭代具有明确定义的含义。
更一般地说,错误消息告诉您 Rust 找到了一个具有正确名称的方法,但该方法不适用于您调用它的类型。
这意味着作用域中有一个具有该名称的函数的特征,但是您正在使用的对象没有实现这样的特征。
在您的特定情况下,包含该all方法的特征是std::iter::Iterator,但是您的对象('a'..'z')if 的类型Range<char>未实现它。
奇怪的是,您的第二个示例可以编译,因为(b'a'..b'z')它的类型Range<u8>确实实现了Iterator.
您可能想知道为什么Range<char>不实现迭代器。那是因为char有效值之间存在无效值,因此这些范围无法迭代。特别是,唯一有效的字符是范围[0x0, 0xD7FF]和[0xE000, 0x10FFFF], IIRC中的字符。