首页 > 解决方案 > 如何为不采用生命周期参数的特征内的类型实现命名生命周期?

问题描述

我正在尝试为 SQL Server 实现 r2d2::ManageConnection 特征。我遇到的问题是我想用于我的实现的连接结构需要一个生命周期参数,但我不知道如何指定生命周期。

添加命名生命周期会按预期给出错误。

 impl r2d2::ManageConnection for SQL_Server_Manager{
    type Connection = odbc::Connection<'a, AutocommitOn>;

type Connection = odbc::Connection<'a, AutocommitOn>;
                                   ^^ undeclared lifetime

尝试使用未命名的生命周期也会引发错误

type Connection = odbc::Connection<'_, AutocommitOn>;
                                    ^^ expected named lifetime parameter

并尝试向特征添加命名的生命周期参数会引发错误

impl<'a> r2d2::ManageConnection<'a> for SQL_Server_Manager{
                                ^^ unexpected lifetime argument

在不采用生命周期参数的 Trait 实现中使用需要命名生命周期参数的类型的正确方法是什么?

标签: rust

解决方案


如果您在实现者类型中放入生命周期(SQL_Server_Manager在您的情况下),它会编译。必须放入一个PhantomData内部来使用这个生命周期并避免另一个编译错误。

操场

struct Foo<'a> {
    val: &'a str,
}

#[derive(Default)]
struct Bar<'a> {
    pd: std::marker::PhantomData<&'a u32>,
}

trait Trait {
    type Connection;
    fn fun(&self, con: Self::Connection);
}

impl<'a> Trait for Bar<'a> {
    type Connection = Foo<'a>;
    fn fun(&self, con: Self::Connection) {
        println!("Implemented {}", con.val);
    }
}

fn main() {
    let b = Bar::default();
    b.fun(Foo{ val:"FOO" }); // Implemented FOO
}

推荐阅读