4

这是我所指的模式的示例函数:

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
}

这段代码接受一个大列表和一个小列表,并返回小列表是否是大列表的子列表。我把它写成我正在做的锻炼练习的一部分。我发现自己经常使用这种模式,我在其中循环一些选项,检查条件,如果找到它则返回 true,如果我在循环结束时没有找到我正在寻找的东西,则返回 false。有这个名字吗?更重要的是,是否有更好的语义化方式来编写它(用 Rust 或任何其他语言)。

4

2 回答 2

4

迭代直到成功就像.find()但是如果您只对true/false结果感兴趣,您可以使用.any(),这正是您所要求的。

测试迭代器的任何元素是否与谓词匹配。

any()接受一个返回trueor的闭包false。它将这个闭包应用于迭代器的每个元素,如果它们中的任何一个返回true,那么返回any()。如果他们都返回false,它返回false

any()正在短路;换句话说,一旦找到 a true,它就会停止处理,因为无论发生什么,结果也将是true

空迭代器返回 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
    })
}
于 2020-12-11T07:22:03.980 回答
1

The loop you provided is an instance of exhaustive search, I would probably call it that. Hence the call for a more efficient loop, but I'm also sceptical if that's possible here. If the big list is sorted, you coud work with binary search.

于 2020-12-15T05:05:27.120 回答