这个 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 的一个实例,我可能会这样称呼它。因此需要更高效的循环,但我也怀疑这是否可行。 如果大列表已排序,您可以使用二进制搜索。