Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Architecture 应用程序体系结构:可变/不可变引用的问题_Architecture_Rust_Immutability_Mutability - Fatal编程技术网

Architecture 应用程序体系结构:可变/不可变引用的问题

Architecture 应用程序体系结构:可变/不可变引用的问题,architecture,rust,immutability,mutability,Architecture,Rust,Immutability,Mutability,我试图编写一个应用程序,用户可以从模板创建对象 在我的梦中,代码如下所示: struct DataTemplate { tmp: u32, } struct Data<'a> { name: &'a str, tmp: u32, } struct Consumer<'a> { items: Vec<Data<'a>>, } struct Library { items: Vec<DataT

我试图编写一个应用程序,用户可以从模板创建对象

在我的梦中,代码如下所示:

struct DataTemplate {
    tmp: u32,
}

struct Data<'a> {
    name: &'a str,
    tmp: u32,
}

struct Consumer<'a> {
    items: Vec<Data<'a>>,
}

struct Library {
    items: Vec<DataTemplate>,
}

struct Application<'a> {
    library: Library,
    consumer: Consumer<'a>,
}

impl DataTemplate {
    fn new(data: u32) -> Self {
        DataTemplate { tmp: data }
    }
}

impl<'a> Data<'a> {
    fn new(name: &'a str, tmp: u32) -> Self {
        Data { name, tmp }
    }
    fn from_template(template: &DataTemplate, name: &'a str) -> Self {
        Data::new(name, template.tmp)
    }
}

impl<'a> Consumer<'a> {
    fn new() -> Self {
        Consumer { items: vec![] }
    }
    fn consume(&mut self, data: Data<'a>) {
        self.items.push(data);
    }
}

impl Library {
    fn new() -> Self {
        Library { items: vec![] }
    }
    fn add(&mut self, d: DataTemplate) {
        self.items.push(d);
    }
    fn get(&self, index: usize) -> &DataTemplate {
        &self.items[index]
    }
}

impl<'a> Application<'a> {
    fn new() -> Self {
        Application {
            library: Library::new(),
            consumer: Consumer::new(),
        }
    }
    fn get_library(&self) -> &Library {
        &self.library
    }
    fn get_library_mut(&mut self) -> &mut Library {
        &mut self.library
    }
    fn get_consumer_mut(&mut self) -> &mut Consumer<'a> {
        &mut self.consumer
    }
}

fn main() {
    let mut app = Application::new();

    use_it(&mut app);
}

fn use_it(app: &mut Application) {
    app.get_library_mut().add(DataTemplate::new(1));
    app.get_library_mut().add(DataTemplate::new(2));
    app.get_library_mut().add(DataTemplate::new(3));

    let item = app.get_library().get(1);
    app.get_consumer_mut()
        .consume(Data::from_template(item, "hi"));
}
我需要获取对应用程序的不可变引用(
let item=app.get_library()
)来获取模板,然后在从模板创建数据项后,我必须将其添加到应用程序中的使用者,现在当然是可变的(
app.get_consumer_mut()


对于这样的问题,有什么共同的解决方案吗?或者这整个想法不是铁锈的方式吗?

在尝试访问消费者之前,您需要确保删除对库的引用。例如:

let data = Data::from_template(app.get_library().get(1), "hi");
app.get_consumer_mut().consume(data);

app
的使用者不知道也不可能知道
app.get\u library()
app.get\u consumer\u mut()
最终不指向同一个引用。因此将应用程序一分为二是否有意义,一个可变的部分和一个不可变的部分?谢谢-我的演示代码遗漏了一个重要的信息:)但是对于给出的代码,这是正确的答案。