Обычно это плохая идея , и она может пойти не так очень легко.
Сначала прочитайте Почему я не могу сохранить значение и ссылку на это значение в одной и той же структуре? для более подробного объяснения того, почему безопасный Rust предотвращает эту конструкцию во время компиляции.
TL; DR, если вы когда-либо переместите структуру Wrapper
, указатель будет недействительным. Разыменование это приведет к неопределенному поведению (плохо).
Если вы можете убедиться, что любой из:
-
Wrapper
никогда не перемещается.
-
ptr
обновляется каждый раз, когда вы перемещаете структуру.
Тогда указатель будет действительным и безопасным для разыменования (при условии, что все другие предупреждения о небезопасном коде поддерживаются).
Что еще хуже, нет причины держать указатель на первом месте; Вы можете взять ссылку на значение и преобразовать его в указатель всякий раз, когда вам нужно:
extern "C" {
fn ffi_fn(data: *mut struct_from_c_t);
}
struct Wrapper {
data: struct_from_c_t,
}
impl Wrapper {
fn do_thing(&mut self) {
unsafe { ffi_fn(&mut self.data) }
}
}
из функций, заимствованных Wrapper
без возможности изменения
Без контекста это кажется сомнительным решением, но у Rust есть инструменты для внутренней изменчивости:
use std::cell::RefCell;
struct Wrapper {
data: RefCell<struct_from_c_t>,
}
impl Wrapper {
fn do_thing(&self) {
unsafe { ffi_fn(&mut *self.data.borrow_mut()) }
}
}