我使用BTreeSet::range
方法遇到了一些麻烦。
use std::collections::BTreeSet;
use std::ops::Bound::Included;
fn main() {
let set = BTreeSet::new();
set.insert("TEST1");
set.insert("TEST3");
set.insert("TEST4");
set.insert("TEST2");
set.insert("TEST5");
let bound = (Included("TEST3"), Included("TEST4"));
let rg = set.range(bound);
println!("result: {:?}", rg);
}
编译器抱怨:
error[E0283]: type annotations required: cannot resolve `_: std::cmp::Ord`
--> src/main.rs:14:18
|
14 | let rg = set.range(bound);
| ^^^^^
这是否意味着&str
无法相互比较?
编译器无法从K: Ord
参数推断出range
函数的第一个泛型参数(Included
)。
您需要明确指定它:
let rg = set.range::<&str, _>(bound);
通过..
(独占端)或..=
(包括端)运算符构建范围,例如, for i in 0..3
意味着0, 1, 2
。相反,for i in 0..=3
意味着0, 1, 2, 3
。
要解决您的问题,您可以指定包含范围:
use std::collections::BTreeSet;
fn main() {
let mut set = BTreeSet::new();
set.insert("TEST1");
set.insert("TEST3");
set.insert("TEST4");
set.insert("TEST2");
set.insert("TEST5");
let rg = set.range("TEST3"..="TEST4");
println!("result: {:?}", rg);
}
这将打印
result: Range { iter: [("TEST3", ()), ("TEST4", ())] }