gpt4 book ai didi

rust - 方便访问原始指针的成员?

转载 作者:行者123 更新时间:2023-11-29 08:03:05 26 4
gpt4 key购买 nike

对于我们知道不需要针对 NULL 检查的实例,访问原始指针的嵌套成员的表示法可能相当笨拙:

struct MyLink {
link: *mut MyLink,
}
let var = *(*(*(*root).link).link).link;

是否可以访问原始指针的结构成员而不必每次都显式取消引用?也许通过使用像 root.link().link().link() 这样的方法或者通过包装类型?

虽然惯用的 Rust 避免了这一点,但在某些异常(exception)情况下并不那么容易避免。 Rc 有内存开销,借用检查器导致内部链接成员出现问题,C-API 可能需要指针......等等。

最佳答案

如果您的代码中经常出现这种情况,我会创建一个通用包装器。

#[repr(C)]
#[derive(Hash)]
struct Ptr<T> {
ptr: *mut T
}

impl<T> Ptr<T> {
pub unsafe fn new(ptr: *mut T) -> Ptr<T> {
debug_assert!(!ptr.is_null());
Ptr { ptr: ptr }
}

#[inline(always)]
pub fn as_pointer(&self) -> *mut T {
self.ptr
}
}

impl<T> Deref for Ptr<T> {
type Target = T;

#[inline(always)]
fn deref(&self) -> &T {
unsafe { &*self.ptr }
}
}

impl<T> DerefMut for Ptr<T> {
#[inline(always)]
fn deref_mut(&mut self) -> &mut T {
unsafe { &mut *self.ptr }
}
}

impl<T> Copy for Ptr<T> { }
impl<T> Clone for Ptr<T> {
#[inline(always)]
fn clone(&self) -> Ptr<T> { *self }
}

impl<T> PartialEq for Ptr<T> {
fn eq(&self, other: &Ptr<T>) -> bool {
self.ptr == other.ptr
}
}

我们在构造时断言 ptr 实际上不为空,因此我们在取消引用时不必再次检查。

然后我们让语言在调用方法或访问属性时检查Deref/DerefMut:

struct MyLink {
link: Ptr<MyLink>,
}

fn main() {
let mut link = MyLink { link: unsafe { Ptr::new(1 as *mut _) } };
let next = MyLink { link: unsafe { Ptr::new(&mut link as *mut _) } };
let _ = next.link;
}

关于rust - 方便访问原始指针的成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40302760/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com