【问题标题】:Lifetimes implementing AsRef实现 AsRef 的生命周期
【发布时间】:2020-09-10 15:34:37
【问题描述】:

我需要创建用于与 FFI 接口的 NewType 包装器。我想创建一个类似于 Rust 的 String 和 str 类型的接口,所以我可以有一个拥有类型的包装器和一个引用的包装器。因为有时我正在处理来自 FFI 库将释放的原始指针的引用,而其他时候我需要获取所有权以便 rust 将释放内存。我希望能够通过在拥有的类型上实现 AsRef 来轻松地使用引用类型上的方法,但是我遇到了生命周期问题。

playground

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<'_>`

错误似乎表明我确实有正确的签名。为什么会失败?

【问题讨论】:

  • 当前的问题是'_ 意味着你拥有它的两个地方的两个不同的生命周期,但除此之外,你打算如何填写todo!()?您不能在函数内创建 MyIntRef 并返回对它的引用。再看看strString 之间的关系——注意它们都没有生命周期参数。
  • 另外,你可以看看CStringCStr的实现,(str是原始类型,但CStr是纯Rust)。
  • 如果您展示了您尝试包装的 C API 是如何进行的,那将会有所帮助。我猜你的 sn-ps 中的 i64 是一个占位符。

标签: rust


【解决方案1】:

我认为你只是把你的特征参数类型弄混了。

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
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-18
    • 1970-01-01
    • 2020-11-05
    • 2014-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多