假设我想显式声明Matches<'a, P>类型.

我可以将哪些实际类型传递为'a而不是使用_

 use std::str::Matches;

fn main() {
    let my_string = "Hello. I have a string and a substring.";
    let pat = "ing";

    let matches: Matches<'_, &'static str> = my_string.matches(pat);

    println!("{}", matches.count());
}

推荐答案

这取决于您如何创建对象.对于您的情况,您使用matches函数来创建Matches. 让我们来判断一下matches的定义:

pub fn matches<'a, P>(&'a self, pat: P) -> Matches<'a, P>
where
    P: Pattern<'a>,

当你呼叫my_string.matches(pat);的时候,'a就变成了my_string的生命周期.(my_string等于&'static str,'a等于'static)

my_string输入为String时,它将是arbitrary lifetime.

在本例中,您不能显式声明生存期,它将从my_string中获取, 但请考虑这样一个函数:

use std::str::Matches;

fn count_ings<'a>(source: &'a str) -> usize {
    let matches: Matches<&'a str> = source.matches("ing"); //explicitly declared

    matches.count()
}

fn main() {
    let my_string = "Hello. I have a string and a substring.".to_string();

    println!("'ing' count: {}", count_ings(&my_string));
}

我认为这为matchesvar带来了轻微的保护,但如果你想使用它,那就使用它吧.此外,您甚至可以 Select 退出终身声明,由于终身省略,不需要添加通配符.

let matches: Matches<_> = source.matches("ing"); //replace with the line above.

Rust相关问答推荐

go 掉包装 struct 中的泛型

如何最好地并行化修改同一Rust向量的多个切片的代码?

在Rust中,有没有一种方法让我定义两个 struct ,其中两个都遵循标准 struct ?

什么是Rust惯用的方式来使特征向量具有单个向量项的别名?

下载压缩文件

为什么这是&q;,而让&q;循环是无限循环?

将一个泛型类型转换为另一个泛型类型

为什么 tokio 在以奇怪的方式调用时只运行 n 个任务中的 n-1 个?

为什么我可以使用 &mut (**ref) 创建两个实时 &mut 到同一个变量?

push 方法是否取得所有权?

如何将这些测试放在一个单独的文件中?

为什么传递 option.as_ref 的行为不同于使用匹配块并将内部映射到 ref 自己?

LinkedList::drain_filter::drop 中 DropGuard 的作用是什么?

为什么 &i32 可以与 Rust 中的 &&i32 进行比较?

通用函数中的生命周期扣除和borrow (通用测试需要)

当 `T` 没有实现 `Debug` 时替代 `unwrap()`

如何在 Rust 的泛型函​​数中同时使用非拥有迭代器和消费迭代器?

返回 &str 但不是 String 时,borrow 时间比预期长

尽管使用了克隆,为什么引用从 lambda 内部泄漏?

GnuCOBOL 调用 Rust:libcob:错误:找不到模块