Pointers 如何将可以为null的原始指针转换为选项?

Pointers 如何将可以为null的原始指针转换为选项?,pointers,rust,optional,nullable,Pointers,Rust,Optional,Nullable,我编写了以下宏: macro_rules! ptr_to_opt { ($p: expr) => { if $p.is_null() { None } else { Some($p) } }; } 这允许我检查匹配中的原始指针: match ptr_to_opt!(myRawPtr) { Some(ptr) => { ... }, None =&

我编写了以下宏:

macro_rules! ptr_to_opt {
    ($p: expr) => {
        if $p.is_null() {
            None
        } else {
            Some($p)
        }
    };
}
这允许我检查
匹配中的原始指针

match ptr_to_opt!(myRawPtr) {
    Some(ptr) => { ... },
    None      => { ... },
}
是否有任何内置功能可将我的
ptr\u替换为\u opt


编辑:


这个问题与
as_ref
将指针转换为引用的意义不同,而我希望保留指针。

是的,您可以使用从
*mut
获取
选项。如果您只需要一个
选项
(您可能不需要考虑
非空
可以做指针可以做的任何事情),那么您可以使用它进行映射。

是的,您可以使用从
*mut
中获取
选项
。如果您只需要一个
选项
(您可能不需要考虑
非空
可以做指针可以做的任何事情),那么您可以映射它。

因此,5个月后,我找到了两种不同的解决方案

首先:使用原始指针的方法。在
Ok
中,将返回一个引用而不是指针,但在某些情况下,引用可以隐式转换为指针,因此在某些情况下它可以工作

秒:以下功能:

use std::ffi::c_void;

pub fn ptr_as_opt(ptr: *mut c_void) -> Option<*mut c_void> {
    if ptr.is_null() {
        None
    } else {
        Some(ptr)
    }
}
使用std::ffi::c_void;
发布fn ptr_as_opt(ptr:*mut c_void)->选项{
如果ptr.is_null(){
没有一个
}否则{
一些(ptr)
}
}

因此,5个月后,我找到了两种不同的解决方案

首先:使用原始指针的方法。在
Ok
中,将返回一个引用而不是指针,但在某些情况下,引用可以隐式转换为指针,因此在某些情况下它可以工作

秒:以下功能:

use std::ffi::c_void;

pub fn ptr_as_opt(ptr: *mut c_void) -> Option<*mut c_void> {
    if ptr.is_null() {
        None
    } else {
        Some(ptr)
    }
}
使用std::ffi::c_void;
发布fn ptr_as_opt(ptr:*mut c_void)->选项{
如果ptr.is_null(){
没有一个
}否则{
一些(ptr)
}
}

这是否回答了您的问题?“这个问题不同于这个问题,因为as_ref将指针转换为引用,而我想保留指针。”你可以在指针完成工作后将引用转换回指针,尽管如果指针悬空,这是UB,或者到未初始化的内存。@Masklin然后使用
ptr\u-to\u-opt
是一个更干净的选项,因为不涉及强制转换。我们回到我问题的开头,这回答了你的问题吗?“这个问题不同于这个问题,因为as_ref将指针转换为引用,而我想保留指针。”你可以在指针完成工作后将引用转换回指针,尽管如果指针悬空,这是UB,或者到未初始化的内存。@Masklin然后使用
ptr\u-to\u-opt
是一个更干净的选项,因为不涉及强制转换。我们回到我问题的开头。