如何创建DST类型?

DST(动态大小类型)现在是Rust中的一件事。 我已经成功地使用了它们,编译器已知的灵活的最后一个成员(例如[u8] )。

但是,我期望做的是创建自定义DST。 说,例如:

struct Known<S> {
    dropit: fn (&mut S) -> (),
    data: S,
}

struct Unknown {
    dropit: fn (&mut ()) -> (),
    data: (),
}

预期使用情况是Box<Known<S>> => Box<Unknown> => Box<Known<S>> ,其中中间件不需要知道具体类型。

注意:是的,我知道Any ,不,我不感兴趣使用它。

然而,我对“ Known和“ Unknown ”版式的建议持开放Unknown

  • size_of::<Box<Known>>() = size_of::<Box<Unknown>>() = size_of::<Box<u32>>() ; 那就是它应该是一个细小的指针。
  • 丢弃Box<Unknown>删除其内容
  • 克隆Box<Unknown> (假设一个可克隆的S ),克隆它的内容
  • 理想情况下, fn dup(u: &Unknown) -> Box<Unknown> { box u.clone() }起作用
  • 我对(3)和(4)有特别的困难,我可以通过手动分配内存来解决(3)(不是使用box ,而是直接调用malloc ),但我更愿意为用户提供一种惯用的体验。

    我找不到任何有关如何通知正确大小分配box的文档。


    目前有两类未处理的对象:slices( [T] ),它添加了一个长度成员; 和trait对象( TraitTrait + Send ,&c。),它添加了一个包含析构函数的vtable,该析构函数知道要释放多大的对象。

    目前没有任何机制来声明你自己的各种未经处理的对象。

    链接地址: http://www.djcxy.com/p/26135.html

    上一篇: How to create a DST type?

    下一篇: Does SQL Azure automatically geo