如何在Rust中显式声明std::str::Matches<'a, P>类型?
Rust中Matches<'a, P>的生命周期参数显式声明方案
你问的是显式声明Matches<'a, P>类型时,除了'_之外,'a可以传递哪些实际类型。核心要搞懂:Matches迭代器持有对原字符串的引用,所以'a必须和原字符串的生命周期完全一致。
下面分两种情况说明:
1. 原字符串是函数内的局部栈变量
这种情况下,你没法直接写出自定义的生命周期标识符(比如'my_str这种写法Rust不允许),但可以通过两种方式显式关联生命周期:
- 利用
'_让编译器自动推导(这也是最常用的方式,你的示例里就是这么用的) - 把逻辑抽成带生命周期参数的函数,通过函数的生命周期绑定来显式标注:
use std::str::Matches; // 这里的'a绑定了输入字符串和返回迭代器的生命周期 fn get_matches<'a>(target: &'a str, pattern: &str) -> Matches<'a, &str> { target.matches(pattern) } fn main() { let my_string = "Hello. I have a string and a substring."; let pat = "ing"; // 这里的'a就是my_string的生命周期,和函数参数的'a完全绑定 let matches: Matches<'_, &'static str> = get_matches(my_string, pat); // 也可以不写类型,编译器会自动推导,效果完全一样 println!("{}", matches.count()); }
2. 原字符串是静态生命周期的字符串
如果原字符串是'static类型(比如直接写的字符串字面量,或者用static关键字声明的字符串),那你可以直接把'a指定为'static:
use std::str::Matches; fn main() { // 显式指定my_string为'static生命周期的字符串 let my_string: &'static str = "Hello. I have a string and a substring."; let pat = "ing"; // 这里直接把'a设为'static,和原字符串生命周期匹配 let matches: Matches<'static, &'static str> = my_string.matches(pat); println!("{}", matches.count()); }
总结
- 局部栈变量对应的生命周期:只能用
'_让编译器推导,或者通过带生命周期参数的函数间接绑定,没法手动写一个具体的生命周期名称。 - 静态生命周期的字符串:可以直接把
'a指定为'static。
内容的提问来源于stack exchange,提问作者user366312
相关产品推荐
相关产品推荐

