【发布时间】:2020-09-10 15:34:37
【问题描述】:
我需要创建用于与 FFI 接口的 NewType 包装器。我想创建一个类似于 Rust 的 String 和 str 类型的接口,所以我可以有一个拥有类型的包装器和一个引用的包装器。因为有时我正在处理来自 FFI 库将释放的原始指针的引用,而其他时候我需要获取所有权以便 rust 将释放内存。我希望能够通过在拥有的类型上实现 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<'_>`
错误似乎表明我确实有正确的签名。为什么会失败?
【问题讨论】:
-
当前的问题是
'_意味着你拥有它的两个地方的两个不同的生命周期,但除此之外,你打算如何填写todo!()?您不能在函数内创建MyIntRef并返回对它的引用。再看看str和String之间的关系——注意它们都没有生命周期参数。 -
另外,你可以看看
CString和CStr的实现,(str是原始类型,但CStr是纯Rust)。 -
如果您展示了您尝试包装的 C API 是如何进行的,那将会有所帮助。我猜你的 sn-ps 中的
i64是一个占位符。
标签: rust