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

时间:2015-02-01 16:39:41

标签: rust

我希望能够创建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));
}

5 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:8)

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

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

1 &4代替4传递给contains()

答案 2 :(得分:1)

您也可以使用match

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

答案 3 :(得分:0)

您也可以使用 answer,它类似于 match

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

也很容易给变量赋值:

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

答案 4 :(得分:-2)

在提出问题之前,您可以通过这种方式来展示您的代码爱好者。

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

3..5 左右的括号必须使用,因为 3..5.contains($4)3..(5.contains($4)) 相同。

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

contains() 方法将引用作为参数。您可以在 rust 参考中找到它 - Range 结构中的 contains() 方法。

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

这就是你得到编译错误的原因,一开始可能会感到困惑。由于 Rust 的所有权和借用制度,当您使用某些函数时,您应该始终考虑使用字面量和引用,而不是仅仅将值放入函数的参数中。