来自静态和可变的 C 指针的 Rust 引用?

问题描述

我正在用 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();