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()
最终不指向同一个引用。因此将应用程序一分为二是否有意义,一个可变的部分和一个不可变的部分?谢谢-我的演示代码遗漏了一个重要的信息:)但是对于给出的代码,这是正确的答案。