Rust 切片指向自身数据的结构

Rust 切片指向自身数据的结构,rust,Rust,我有一个结构 struct Foo<'a> { buf: [u8, ..64], slice: &'a [u8] } 如果我尝试执行以下操作,借用检查器会抱怨(正确),因为切片的生存期将比结构短 impl<'a> Foo<'a> { fn new() -> Foo<'a> { let buf = [0, ..64]; Foo { buf: buf,

我有一个结构

struct Foo<'a> {
    buf: [u8, ..64],
    slice: &'a [u8]
}
如果我尝试执行以下操作,借用检查器会抱怨(正确),因为切片的生存期将比结构短

impl<'a> Foo<'a> {
    fn new() -> Foo<'a> {
        let buf = [0, ..64];
        Foo {
            buf: buf,
            slice: buf.slice_from(0)
        }
    }
}

然而,这个问题只是一个更为通用的用例的简化,即结构拥有数据,并对相同的数据进行引用,我想知道这是否可能(以安全的方式)在Rust中实现。

不,你不能安全地实现它,因为一般来说,这样的结构是不可移动的。假设这是可能的,您可以创建这样的结构:

let foo = Foo {
    buf: [0, ..64],
    slice: obtain_slice_somehow()
};
slice
字段现在是
buf
字段的一个切片,特别是,它包含一个指向当前位于堆栈上的
buf
的指针。现在将
foo
放入一个框中,并从函数返回:

return Box::new(foo);

foo
值现在移动到heap,函数退出,释放堆栈内存。然而,
slice
指针并没有被调整为指向堆,因为一般来说这是不可能的,所以它悬空,违反了内存安全。

我问了一个类似的问题(),不幸的是,似乎没有安全的方法来做这件事。我理解。然而,如果buf是一个Vec呢?然后指针将始终位于堆上,即使移动了foo也不会变得无效。我刚刚意识到vec当然可以随着其增长而重新分配,从而导致切片中的旧指针变得无效。然而,这样做似乎有可能愚弄借钱人。不过,我可能会添加另一个与此相关的问题。@dnaq,我怀疑是否有可能愚弄借阅检查器:)如果你能够,这肯定是rustc中的一个错误。我能够愚弄借阅检查器,错误报告是,相关的reddit帖子是。
let foo = Foo {
    buf: [0, ..64],
    slice: obtain_slice_somehow()
};
return Box::new(foo);