当出现“方法存在但特质限制未满足”时,这意味着什么?

23
我是 Rust 的新手,发现了一些我无法理解的情况。当我写下

时,
fn main() {
    ('a'..'z').all(|_| true);
}

编译器报告了一个错误:

error[E0599]: no method named `all` found for type `std::ops::Range<char>` in the current scope
 --> src/main.rs:2:16
  |
2 |     ('a'..'z').all(|_| true)
  |                ^^^
  |
  = note: the method `all` exists but the following trait bounds were not satisfied:
          `std::ops::Range<char> : std::iter::Iterator`

当我将其更改为

fn main() {
    (b'a'..b'z').all(|_| true);
}

编译通过了。

这里发生了什么?当 Rust 说 该方法…已存在但未满足以下特性限制 时,它是指什么?


1
你可以使用char映射来实现你想要的效果,例如:https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=120f51cf16015dfdd244175b07c6ec22 - Boiethios
2个回答

25
方法all()Iterator特质的方法,因此您只能在实现该特质的类型上调用它。类型Range<char>没有实现Iterator特质,因为Unicode字符范围在一般情况下并不是严格定义的。有效的Unicode码点集合存在间隙,构建代码点的范围一般认为没有意义。另一方面,类型Range<u8>实现了Iterator,因为迭代一组字节具有明确定义的含义。

更一般地说,错误信息告诉您Rust找到了正确名称的方法,但该方法不适用于您调用它的类型。


13
这意味着作用域中有一个带有该名称函数的特征,但你使用的对象没有实现这样的特征。
在您的特定情况下,包含all方法的特征是std :: iter :: Iterator,但您的对象('a'..'z')是类型为Range<char>的对象,它没有实现它。
有趣的是,第二个示例编译成功,因为(b'a'..b'z')是类型为Range<u8>的对象,它确实实现了Iterator
你可能想知道为什么Range<char>没有实现迭代器。那是因为有效字符之间存在无效的char值,因此这些范围不能被迭代。特别地,只有那些在范围[0x0, 0xD7FF][0xE000, 0x10FFFF]内的有效字符,如果我没记错的话。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接