加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式捕获迭代器方法移动迭代器

发布时间:2020-12-14 06:09:30 所属栏目:百科 来源:网络整理
导读:我用这个正则表达式处理格式为“1s:1d”,“100:5000”等的简单字符串: let retention_matcher = regex::Regex::new({r"^(d+)([smhdy])?:(d+)([smhdy])?$"}).unwrap(); 我知道这个正则表达式应该只匹配一次所以我想运行正则表达式捕获并检查捕获的数量.
我用这个正则表达式处理格式为“1s:1d”,“100:5000”等的简单字符串:

let retention_matcher = regex::Regex::new({r"^(d+)([smhdy])?:(d+)([smhdy])?$"}).unwrap();

我知道这个正则表达式应该只匹配一次所以我想运行正则表达式捕获并检查捕获的数量.

let iter = retention_matcher.captures_iter(ts);
    let count = iter.count();
    println!("iter.count(): {}",count);

    let _ : Vec<Option<(u64,u64)>> = iter.map(|regex_match| {
        let retval = retention_spec_to_pair(regex_match);
        println!("precision_opt: {:?}",retval);
        retval
    }).collect();

问题是count()方法移动了它,我不能再使用它了.

src/bin/whisper.rs:147:42: 147:46 error: use of moved value: `iter`
src/bin/whisper.rs:147         let _ : Vec<Option<(u64,u64)>> = iter.map(|regex_match| {
                                                                ^~~~
src/bin/whisper.rs:144:21: 144:25 note: `iter` moved here because it has type `regex::re::FindCaptures<'_,'_>`,which is non-copyable
src/bin/whisper.rs:144         let count = iter.count();

这对我来说没有意义. count方法是否只返回一个可复制的usize值而不是移动它?我该如何解决这个问题?

解决方法

我怀疑你认为它是一个抽象的捕获序列.将其视为表示抽象的捕获序列中的位置更准确.任何迭代器知道要做的基本事情是前进到序列中的下一个项目;也就是说,您可以提升位置并获得序列中的下一个元素.

count会移动它,因为为了计算序列中有多少元素,它必须生成整个序列.这必然通过遍历整个序列来修改迭代器.它移动是因为在调用count之后,迭代器真的不再有用了.根据定义,它必须超过序列的结尾!

遗憾的是,它看起来不像有问题的迭代器类型(FindCaptures)是克隆,所以你不能只是复制它.

解决方案是将代码重组为不调用计数.如果你想得到第一个元素并确保没有更多,最简单的模式是:

let mut iter = ...;
if let Some(regex_match) = iter.next() {
    // Ensure that there is no next element.
    assert_eq!(iter.next(),None);

    // process regex_match ...
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读