相关疑难解决方法(0)

为什么我不能在同一个结构中存储值和对该值的引用?

我有一个值,我想在我自己的类型中存储该值以及对该值内部内容的引用:

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)

在每种情况下,我都会收到一个错误,即其中一个值"活不够长".这个错误是什么意思?

lifetime rust borrow-checker

193
推荐指数
3
解决办法
2万
查看次数

结构切片指向数据本身

我有一个结构

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中是否可以(以安全的方式).

rust

5
推荐指数
1
解决办法
322
查看次数

标签 统计

rust ×2

borrow-checker ×1

lifetime ×1