如何测试一个值是否在一个范围内?

How can I test if a value lies within a Range?

我希望能够创建一个 Range,然后测试该范围内是否包含变量。看起来像这样的东西:

fn main() {
    let a = 3..5;
    assert!(a.contains(4));
}

现在,我看到的唯一明显的事情就是使用 Iterator::any。这很难看,因为它需要 O(1) 操作并使其成为 O(n):

fn main() {
    let mut a = 3..5;
    assert!(a.any(|v: i32| v == 4));
}

Range本身没有任何东西(目前,反正),但做到这一点并不难;毕竟,只需要几个比较:

4 >= a.start && 4 < a.end

从 Rust 1.35 开始,原始代码将 几乎1 使用 Range::contains 编译 as-is:

fn main() {
    let a = 3..5;
    assert!(a.contains(&4));
}

1&4 而不是 4 传递给 contains().

您可以使用 match 来:

fn main() {
    let v = 132;
    match v {
        1...100 => println!("Inside"),
        _ => println!("Outside")
    }
}

在提出问题之前,您可以通过这种方式稍微展示一下您的代码。

fn main() {
    assert!((3..5).contains(&4));
}

3..5 左右的括号 必须 使用,因为 3..5.contains()3..(5.contains()).

相同

让我们从为什么在 contains() 方法中 4 之前需要 $ 开始。

contains() 方法以引用为参数。您可以在 Rust 参考资料中找到它——contains() 方法在 Range 结构中。

这意味着您没有从 contains() 的参数中取得所有权。此方法用于检查是否有您要查找的项目。因此,此方法没有理由获取作为 contains().

参数的项目的所有权

这就是您遇到编译错误的原因,一开始可能会对此感到困惑。由于 rust 的所有权和借用系统,当你使用一些函数时,你应该始终考虑使用带引用的文字,而不是仅仅将值放入函数的参数中。

你也可以使用if let,类似于match:

if let 3..=5 = 4 {
    println!("Inside");
}

也很容易赋值给一个变量:

let s = if let 3..=5 = 4 {
    "Inside"
} else {
    "Outside"
};
println!("{}", s);