首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为特征中不带生命周期参数的类型实现命名生命周期?

如何为特征中不带生命周期参数的类型实现命名生命周期?
EN

Stack Overflow用户
提问于 2020-08-10 01:23:27
回答 1查看 60关注 0票数 0

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

添加命名生存期会产生预期的错误。

代码语言:javascript
复制
 impl r2d2::ManageConnection for SQL_Server_Manager{
    type Connection = odbc::Connection<'a, AutocommitOn>;

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

尝试使用未命名的生存期也会抛出错误

代码语言:javascript
复制
type Connection = odbc::Connection<'_, AutocommitOn>;
                                    ^^ expected named lifetime parameter

尝试向特征添加一个命名的生命周期参数会抛出一个错误

代码语言:javascript
复制
impl<'a> r2d2::ManageConnection<'a> for SQL_Server_Manager{
                                ^^ unexpected lifetime argument

在不接受生命周期参数的特征实现中,使用需要命名生命周期参数的类型的正确方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-10 02:00:42

如果您在实现者类型(在本例中为SQL_Server_Manager)中设置了生命周期,它就会进行编译。我不得不在里面放一个PhantomData来使用这个生命周期,并避免另一个编译错误。

Playground

代码语言:javascript
复制
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
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63329300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档