我正在使用regex
条板箱在rustpython中的re模块上进行开发。我想将Match
对象存储在没有生命周期的结构中。有办法吗?
到目前为止,我仅将match对象的start
和end
值复制到单独的字段中,但这感觉很奇怪和错误。应该有一种存储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吗?
答案 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,
}
...然后可以避免任何复制,而只需增加引用计数即可。