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

She*_*ter 13 rust

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

fn main() {
    let a = 3..5;
    assert!(a.contains(4));
}
Run Code Online (Sandbox Code Playgroud)

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

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

She*_*ter 15

在更多版本中,原始代码将按原样编译.现在,Range::contains作为夜间功能存在:

fn main() {
    let a = 3..5;
    assert!(a.contains(&4));
}
Run Code Online (Sandbox Code Playgroud)

问题32311中跟踪该特征的稳定性.

  • 拥有一个可以在任何 num 类型上调用的名为 Between(a, b) 的方法没有意义吗?我确实喜欢你的答案,但我不确定我是否喜欢我需要先创建“Range”。我的原因很简单:大多数 IDE 都会自动完成 ` Between` 方法。 (4认同)

All*_*ain 10

您还可以使用if let,类似于match

if let 3..=5 = 4 {
    println!("Inside");
}
Run Code Online (Sandbox Code Playgroud)

分配给变量也很容易:

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

  • 请注意,这仅适用于 const 范围。 (2认同)

Chr*_*gan 9

Range本身没有任何东西(目前,无论如何),但这并不困难; 毕竟,它只需要几个比较:

4 >= a.start && 4 < a.end
Run Code Online (Sandbox Code Playgroud)

  • 不是没有RFC.坦率地说,在1.0之前不太可能进行不必要的功能扩展.也就是说,RFC相对容易编写. (2认同)

Rub*_*yan 8

您也可以使用match

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

  • 根据 rustc 版本 1.51.0,...(范围模式)已被 **弃用**。请改用 ..=(包含范围)。另请参阅[独占范围模式的跟踪问题](https://github.com/rust-lang/rust/issues/37854)。 (2认同)