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

时间:2016-10-28 08:51:47

标签: types rust

在结构中使用原始点时,Rust不允许从默认值派生。

例如:

#[derive(Default)]
struct Foo {
    bar: *mut Foo,
    baz: usize,
}

报告

error[E0277]: the trait bound `*mut Foo: std::default::Default` is not satisfied

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

impl Default for *mut Foo {
    fn default() -> *mut Foo {
        ptr::null_mut()
    }
}

这会出错:

impl doesn't use types inside crate

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

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

1 个答案:

答案 0 :(得分:6)

  

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

,目前还没有。需要在crate中定义特征或类型,其中写入了trait-impl(所谓的“孤儿规则”)。

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

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

impl<T> Default for ZeroedMutPtr<T> { ... }