Введите аннотации, необходимые при использовании BTreeSet :: range для набора & str - PullRequest
0 голосов
/ 22 февраля 2019

Я столкнулся с некоторыми проблемами при использовании метода 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 нельзя сравнивать друг с другом?

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Компилятор не может вывести первый универсальный параметр (K: Ord) функции range из аргумента Included.

Вам необходимо указать это явно:

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

Детская площадка

0 голосов
/ 22 февраля 2019

Диапазон строится с помощью операторов .. (исключающий конец) или ..= (включающий конец), например, 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", ())] }
...