我希望能够创建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));
}
答案 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 的所有权和借用制度,当您使用某些函数时,您应该始终考虑使用字面量和引用,而不是仅仅将值放入函数的参数中。