gpt4 book ai didi

rust - 借用将在结构中移动的值的指针

转载 作者:行者123 更新时间:2023-11-29 08:17:13 27 4
gpt4 key购买 nike

假设 Manager 持有对 DesignerProgrammer 的引用,但是 Programmer 也必须保留对 Designer 的引用,以便在他们需要时对他们执行 ping 操作。

问题是,通过在 Manager::new() 中创建 DesignerProgrammer&designer 引用的生命周期不够长,因为在接下来的几行中,它被移动到 Manager 中。

错误是'designer' does not live long enough

struct Programmer<'a> {
designer: &'a Designer,
}

impl<'a> Programmer<'a> {
pub fn new(designer: &'a Designer) -> Programmer<'a> {
Programmer { designer: designer }
}
}

struct Designer {
iq: u32,
}

impl Designer {
pub fn new(iq: u32) -> Designer {
Designer { iq: iq }
}
}

struct Manager<'a> {
programmer: Programmer<'a>,
designer: Designer
}

impl<'a> Manager<'a> {
pub fn new() -> Manager<'a> {
let designer = Designer::new(42);
let programmer = Programmer::new(&designer);

Manager { designer: designer, programmer: programmer }
}
}

fn main() {
Manager::new();
}

编译失败并显示此消息:

test.rs:29:47: 29:55 error: `designer` does not live long enough
test.rs:29 let programmer = Programmer::new(&designer);
^~~~~~~~
test.rs:27:37: 32:10 note: reference must be valid for the lifetime 'a as defined on the block at 27:36...
test.rs:27 pub fn new() -> Manager<'a> {
test.rs:28 let designer = Designer::new(42);
test.rs:29 let programmer = Programmer::new(&designer);
test.rs:30
test.rs:31 Manager { designer: designer, programmer: programmer }
test.rs:32 }
test.rs:27:37: 32:10 note: ...but borrowed value is only valid for the block at 27:36
test.rs:27 pub fn new() -> Manager<'a> {
test.rs:28 let designer = Designer::new(42);
test.rs:29 let programmer = Programmer::new(&designer);
test.rs:30
test.rs:31 Manager { designer: designer, programmer: programmer }
test.rs:32 }

如何在不通过 Manager::new(&designer) 注入(inject) Designer 的情况下解决这个问题?

最佳答案

我想您知道自己在做什么,但这似乎不是与 Rust 一起使用的最佳设计。你说 Programmer 应该持有对 Designer 的引用以便 ping 他们,但我想 ping 他们意味着在某些方面改变 Designer方式(例如,想象一下 Designer 上的一些 is_pinged 字段),您不能通过简单的引用来做到这一点。通过常规的、不可变 引用,您所能做的就是读取数据或调用不会改变变量的方法。更重要的是,只要您拥有该引用,就无法更改原始 Designer

如果你只是想要一个不可变的引用,那么你可以使用 Rc类型,它提供了一个不可变的引用计数指针。

如果您想以某种方式允许 ProgrammerDesigner 发送消息,这可能会或可能不会触发 Designer 上的突变,那么您可以尝试使用 channel 。每个 Designer 都会存储自己的 channel , 它可能有一个克隆 Sender 的方法供有兴趣的 Programmer 存储和使用的 channel 结束。

关于rust - 借用将在结构中移动的值的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26963430/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com