如何解决实施AsRef的生命周期
我需要创建用于与FFI接口的NewType包装器。我想创建一个类似于Rust的String和str类型的接口,因此我可以为拥有的类型提供一个包装器,并为引用提供一个包装器。因为有时候我要处理来自FFI库将释放的原始指针的引用,而另一些时候我需要取得所有权,以便锈会释放内存。我希望能够通过在拥有的类型上实现AsRef来轻松地在引用类型上使用这些方法,但是生命周期存在问题。
pub struct MyInt(i64);
pub struct MyIntRef<'a>(&'a i64);
impl AsRef<MyIntRef<'_>> for MyInt {
fn as_ref(&self) -> &MyIntRef<'_> {
todo!()
}
}
此代码无法编译,并出现以下错误:
= note: expected `fn(&MyInt) -> &MyIntRef<'_>`
found `fn(&MyInt) -> &MyIntRef<'_>`
该错误似乎表明我确实具有正确的签名。为什么会失败?
解决方法
我认为您刚刚混用了trait参数类型。
pub struct MyInt(i64);
pub struct MyIntRef<'a>(&'a i64);
impl AsRef<i64> for MyInt {
fn as_ref(&self) -> &i64 {
&self.0
}
}
impl<'a> AsRef<i64> for MyIntRef<'a> {
fn as_ref(&self) -> &i64 {
self.0
}
}