我有一个值,我想在我自己的类型中存储该值以及对该值内部内容的引用:
struct Thing {
count: u32,
}
struct Combined<'a>(Thing, &'a u32);
fn make_combined<'a>() -> Combined<'a> {
let thing = Thing { count: 42 };
Combined(thing, &thing.count)
}
Run Code Online (Sandbox Code Playgroud)
有时候,我有一个值,我想在同一个结构中存储该值和对该值的引用:
struct Combined<'a>(Thing, &'a Thing);
fn make_combined<'a>() -> Combined<'a> {
let thing = Thing::new();
Combined(thing, &thing)
}
Run Code Online (Sandbox Code Playgroud)
有时,我甚至没有参考该值,我得到同样的错误:
struct Combined<'a>(Parent, Child<'a>);
fn make_combined<'a>() -> Combined<'a> {
let parent = Parent::new();
let child = parent.child();
Combined(parent, child)
}
Run Code Online (Sandbox Code Playgroud)
在每种情况下,我都会收到一个错误,即其中一个值"活不够长".这个错误是什么意思?
我有一个结构
struct Foo<'a> {
buf: [u8, ..64],
slice: &'a [u8]
}
Run Code Online (Sandbox Code Playgroud)
切片应该指向buf结构的字段.有没有办法构建这样的结构?就像是:
impl<'a> Foo<'a> {
fn new() -> Foo<'a> {
Foo {
buf: [0, ..64],
slice: ???? /* I don't know what to write here */
}
}
Run Code Online (Sandbox Code Playgroud)
如果我尝试执行类似下面的操作,则借用检查器会(正确地)抱怨,因为切片的生命周期将比结构更短.
impl<'a> Foo<'a> {
fn new() -> Foo<'a> {
let buf = [0, ..64];
Foo {
buf: buf,
slice: buf.slice_from(0)
}
}
}
Run Code Online (Sandbox Code Playgroud)
我意识到,对于这个简单的情况,我可以保留偏移量并手动调用切片函数:
struct Foo {
buf: [u8, ..64],
slice_from: uint,
slice_to: uint
}
Run Code Online (Sandbox Code Playgroud)
然而,这个问题只是对拥有数据的结构的更一般用例的简化,并且引用了相同的数据,我想知道在Rust中是否可以(以安全的方式).