这个 for 循环模式有名称吗?如果有,是否有更好的编写方法?
Is there a name for this for loop pattern and if so is there a better way to write it?
这是我所指模式的示例函数:
fn check_sub_listiness<T: PartialEq>(big_list: &[T], small_list: &[T]) -> bool {
for poss_sublist in big_list.windows(small_list.len()) {
if poss_sublist == small_list {
return true;
}
}
false
}
此代码接受一个大列表和一个小列表,并return判断小列表是否是大列表的子列表。我把它写成我正在做的练习的一部分。
我发现自己经常使用这种模式,我循环遍历一些选项,检查条件,如果找到它则 return 为真,如果我在循环结束时没有找到我要找的东西则为假.有这个名字吗?更重要的是,是否有更好的语义方式来编写它(用 Rust 或任何其他语言)。
迭代直到成功就像 .find()
but if you're only interested in a true
/false
result you can use .any()
,这正是您所要求的。
Tests if any element of the iterator matches a predicate.
any()
takes a closure that returns true
or false
. It applies this closure to each element of the iterator, and if any of them return true
, then so does any()
. If they all return false
, it returns false
.
any()
is short-circuiting; in other words, it will stop processing as soon as it finds a true
, given that no matter what else happens, the result will also be true
.
An empty iterator returns false.
所以你的循环可以这样写:
fn check_sub_listiness<T: PartialEq>(big_list: &[T], small_list: &[T]) -> bool {
big_list.windows(small_list.len()).any(|poss_sublist| {
poss_sublist == small_list
})
}
您提供的循环是 exhaustive search 的一个实例,我可能会这样称呼它。因此需要更高效的循环,但我也怀疑这是否可行。
如果大列表已排序,您可以使用二进制搜索。
这是我所指模式的示例函数:
fn check_sub_listiness<T: PartialEq>(big_list: &[T], small_list: &[T]) -> bool {
for poss_sublist in big_list.windows(small_list.len()) {
if poss_sublist == small_list {
return true;
}
}
false
}
此代码接受一个大列表和一个小列表,并return判断小列表是否是大列表的子列表。我把它写成我正在做的练习的一部分。 我发现自己经常使用这种模式,我循环遍历一些选项,检查条件,如果找到它则 return 为真,如果我在循环结束时没有找到我要找的东西则为假.有这个名字吗?更重要的是,是否有更好的语义方式来编写它(用 Rust 或任何其他语言)。
迭代直到成功就像 .find()
but if you're only interested in a true
/false
result you can use .any()
,这正是您所要求的。
Tests if any element of the iterator matches a predicate.
any()
takes a closure that returnstrue
orfalse
. It applies this closure to each element of the iterator, and if any of them returntrue
, then so doesany()
. If they all returnfalse
, it returnsfalse
.
any()
is short-circuiting; in other words, it will stop processing as soon as it finds atrue
, given that no matter what else happens, the result will also betrue
.An empty iterator returns false.
所以你的循环可以这样写:
fn check_sub_listiness<T: PartialEq>(big_list: &[T], small_list: &[T]) -> bool {
big_list.windows(small_list.len()).any(|poss_sublist| {
poss_sublist == small_list
})
}
您提供的循环是 exhaustive search 的一个实例,我可能会这样称呼它。因此需要更高效的循环,但我也怀疑这是否可行。 如果大列表已排序,您可以使用二进制搜索。