“方法存在但特征边界不满足”是什么意思?

dmk*_*yat 7 rust

我是 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 找到了一个具有正确名称的方法,但该方法不适用于您调用它的类型。


rod*_*igo 5

这意味着作用域中有一个具有该名称的函数的特征,但是您正在使用的对象没有实现这样的特征。

在您的特定情况下,包含该all方法的特征是std::iter::Iterator,但是您的对象('a'..'z')if 的类型Range<char>未实现它。

奇怪的是,您的第二个示例可以编译,因为(b'a'..b'z')它的类型Range<u8>确实实现了Iterator.

您可能想知道为什么Range<char>不实现迭代器。那是因为char有效值之间存在无效值,因此这些范围无法迭代。特别是,唯一有效的字符是范围[0x0, 0xD7FF][0xE000, 0x10FFFF], IIRC中的字符。