问题描述
我正在用 Rust 编写一个 C 接口库。我的 API 非常类似于 C:我将“不透明”指针作为函数参数,我必须将其转换为指向库内部结构的指针。所以指针的生命周期比函数调用(静态)更长,指针指向可变数据(库负责初始化和获取/设置这些数据)。可变性 + 静态数据隐含地是 API 的一部分,但在 rust 中,我在说明这一点时遇到了麻烦(我认为只是语法)。
代码如下:
struct Real_attr { ... }
pub extern "C" fn attr_init(attr: *mut attr_ptr) -> cty::c_int {
let p : *mut Real_attr = attr.cast::<Real_attr>();
let r : &mut Real_attr = p.as_ref::<'static'>().unwrap();
...
}
42 | p.as_ref::<'static>()
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ types differ in mutability
|
= note: expected enum `Option<&'static mut Real_attr>`
found enum `Option<&'static Real_attr>`
但我不明白如何“强制转换”或以其他方式指定该引用是可变的,在 static 出现语法错误后添加 mut
..
解决方法
如果你想要一个可变引用,你正在寻找 as_mut
。
let r : &mut Real_attr = p.as_mut::<'static>().unwrap();