rust - 如何为不采用生命周期参数的特征内的类型实现命名生命周期?
问题描述
我正在尝试为 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 实现中使用需要命名生命周期参数的类型的正确方法是什么?
解决方案
如果您在实现者类型中放入生命周期(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
}
推荐阅读
- wpf - WPF 样式 Textblock.textWraping 不起作用
- python - 在 python 中使用给定密钥生成 AES 256 GCM 密钥
- angular - 显示输出并显示角度类型错误?
- next.js - 在下一个 js 中使用 onclick 事件获取图像源路径
- excel - 没有要复制的数据时如何停止 VBA 错误
- python - 循环遍历日期并将值分配为周数
- c++ - std::string 隐式转换优先级,string_view 优于 const char*
- reactjs - react native firebase auth signInAnonymously 判断客户端(如手机、网页)
- nearprotocol - “集合是一种不一致的状态。” 带有嵌套的 NEAR 集合
- c++ - 调用构造函数的指针对象给出了其他一些非预期的结果