如何为原始指针实现`Default`?

ide*_*n42 5 types rust

在结构中使用原始点时,Rust不允许从Default派生.

例如:

#[derive(Default)]
struct Foo {
    bar: *mut Foo,
    baz: usize,
}
Run Code Online (Sandbox Code Playgroud)

报告

error[E0277]: the trait bound `*mut Foo: std::default::Default` is not satisfied
Run Code Online (Sandbox Code Playgroud)

我试过这个,但它不起作用:

impl Default for *mut Foo {
    fn default() -> *mut Foo {
        ptr::null_mut()
    }
}
Run Code Online (Sandbox Code Playgroud)

这给出了一个错误:

impl doesn't use types inside crate
Run Code Online (Sandbox Code Playgroud)

有没有办法声明Default原始指针?

否则我将不得不default为任何struct包含原始指针的函数编写显式函数,在本例中为OK,但对于较大的结构,它可能很乏味,所以我希望在某些情况下能够避免它.

Luk*_*odt 6

有没有办法为原始指针声明Default?

,目前还没有.需要在包中编写trait-impl的特征或类型(所谓的"孤儿规则").

但是,您不需要为Default包含指针的所有类型手动实现.您可以创建一个新类型,它包装一个原始指针并执行Default.然后你可以在所有结构中使用这个新类型并简单地派生Default.

struct ZeroedMutPtr<T>(pub *mut T);

impl<T> Default for ZeroedMutPtr<T> { ... } 
Run Code Online (Sandbox Code Playgroud)