如何测试一个值是否在一个范围内?
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);
我希望能够创建一个 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);