单参数函数的生命周期

4

我已经阅读了Rust Book和一些其他关于生命周期的教程。我之前认为生命周期就像是一个函数接受的泛型参数,你将其分配到输入和输出参数后就会限制这些参数的生命周期。例如fn find<'a, 'b>(pattern: &'a str, text: &'b str) -> &'b str表示任何传递给text的参数需要具有至少与返回值一样长的生命周期。但是,在我写的一个程序中,我遇到了一个错误,这使我认为我对生命周期的理解存在某些根本性的误解。

下面是该函数的签名:

async fn check_git(requester: &mut Requester) -> Result<()>

Resultanyhow::Result,如果需要的话。

当我编译时,出现错误:

error[E0726]: implicit elided lifetime not allowed here
 --> src/scanner/git.rs:5:40
  |
5 | pub async fn check_git(requester: &mut Requester) -> Result<()> {
  |                                        ^^^^^^^^^- help: indicate the anonymous lifetime: `<'_>`
  |
  = note: assuming a `'static` lifetime...

我通过添加生命周期参数来解决编译错误:async fn check_git<'a>(requester: &mut Requester<'a>) -> Result<()>。 我理解requester不能有静态生命周期,因为我调用check_git的方式,传入的requester 生命周期是调用check_git的函数的作用域。但我不明白我加入的生命周期注释确切的含义。
我初学者的理解是,fn check_git<'a>只是指定'a是一个通用参数,然后当您将'a应用到多个参数时,它会限制这些参数的生命周期关系。但是当我只将'a应用于一个参数时,生命周期注释没有增加任何约束或含义吗?
我要添加生命周期参数的Requester结构体定义为:
struct Requester<'a> {
    client: SendRequest<Body>,
    resp: Option<Response<Body>>,
    host: &'a str,
    port: u16,
    ctx: &'a SslContextRef,
}
1个回答

8
但是,当我只将“a”应用于一个参数时,没有从生命周期注释中添加约束或含义,对吗?
是的。这里的规则不是关于“您应该指定额外的约束条件”。而是,当您使用具有生命周期参数的类型时,应使其在语法上可见存在生命周期。对于引用,'&'符号本身被认为足够,但对于命名类型,您应该使生命周期本身可见。
(尽管我建议使用lint配置#![deny(rust_2018_idioms)]禁止在非async函数中使用隐藏的生命周期参数。)
这并不意味着您必须引入'a'; 您可以指定'_', 这基本上意味着“请使用生命周期省略规则”,因此通常情况下,“请在这里使用匿名的不同生命周期”。因此,请写:
pub async fn check_git(requester: &mut Requester<'_>) -> Result<()> {

这遵循与省略&生命周期相同的规则,因此在这种情况下,它与编写无省略形式相同。
pub async fn check_git<'a, 'b>(requester: &'a mut Requester<'b>) -> Result<()> {

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接