在一组&str上使用BTreeSet :: range时,需要输入注释

问题描述 投票:0回答:2

我使用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无法相互比较?

rust set range binary-tree type-inference
2个回答
4
投票

编译器无法从K: Ord参数推断出range函数的第一个泛型参数(Included)。

您需要明确指定它:

let rg = set.range::<&str, _>(bound);

Playground


3
投票

通过..(独占端)或..=(包括端)运算符构建范围,例如, 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", ())] }
© www.soinside.com 2019 - 2024. All rights reserved.