如何在没有生命周期参数的情况下将`regex :: Match`对象存储在结构中?

时间:2019-07-11 18:26:36

标签: rust

我正在使用regex条板箱在rustpython中的re模块上进行开发。我想将Match对象存储在没有生命周期的结构中。有办法吗?

到目前为止,我仅将match对象的startend值复制到单独的字段中,但这感觉很奇怪和错误。应该有一种存储Match对象本身的方法。 (相应的代码位于此处https://github.com/RustPython/RustPython/blob/master/vm/src/stdlib/re.rs#L78

struct PyMatch {
    start: usize,
    end: usize,
}

我想做的是这样

struct PyMatch {
    text: &'t str,  // the original string
    m: Match<'t>,   // the match on the string
}

但这需要我将生存期参数't添加到结构PyMatch中,这是我不想要的,或者不知道该怎么做。 BoxRef板条箱会在这里帮助我吗?我需要RefCell吗?

1 个答案:

答案 0 :(得分:1)

您无法删除Match对象的生存期,因为它的定义如下:

struct Match<'t> {
    text: &'t str,
    start: usize,
    end: usize,
}

换句话说,Match对象包含对所搜索文本的引用。

您没有提供很多关于您到底想做什么的上下文,但是删除生存期的直接方法是像这样定义PyMatch类型:

struct PyMatch {
    text: String,
    start: usize,
    end: usize,
}

然后通过复制整个干草堆或仅复制干草堆中匹配的部分(可能很小)来创建它。

根据您的上下文,如果对您提供给regex匹配函数的干草堆进行了引用计数,则可以这样定义PyMatch类型:

struct PyMatch {
    // Generated from the original haystack.
    text: Rc<String>,
    start: usize,
    end: usize,
}

...然后可以避免任何复制,而只需增加引用计数即可。