我有一个看起来像这样的结构:
pub struct Coordinator {
map_tasks: Mutex<Vec<Task>>,
reduce_tasks: Mutex<Vec<Task>>,
}
我有一个使用参数调用的函数,以确定要修改两个向量中的哪一个。该函数采用类型和 id 在向量中查找并修改。我原来的做法是这样的:
impl Coordinator {
pub fn update_status(&self, task_type: TaskType, task_id: u8) {
if task_type == TaskType::Map {
let tasks = &mut self.map_tasks.lock().unwrap();
for task in tasks.iter_mut() {
if task.task_id == task_id {
task.status = TaskStatus::Success;
}
}
} else {
let tasks = &mut self.reduce_tasks.lock().unwrap();
for task in tasks.iter_mut() {
if task.task_id == task_id {
task.status = TaskStatus::Success;
}
}
}
}
}
我想缩短代码,因为其中很多都是重复的。我已经尝试过这个,但它不适用于错误借用时临时值被丢弃,请考虑使用“let”绑定(bind)来创建生命周期更长的值
impl Coordinator {
pub fn update_status(&self, task_type: TaskType, task_id: u8) {
let tasks;
if task_type == TaskType::Map {
tasks = &mut self.map_tasks.lock().unwrap();
} else {
tasks = &mut self.reduce_tasks.lock().unwrap();
}
for task in tasks.iter_mut() {
if task.task_id == task_id {
task.status = TaskStatus::Success;
}
}
}
}
我该如何解决这个问题?
最佳答案
您不需要将可变引用放入守卫中,您可以直接存储守卫。另外,if..else
是一个表达式,您可以将其用作三元:
impl Coordinator {
pub fn update_status(&self, task_type: TaskType, task_id: u8) {
let mut tasks = if task_type == TaskType::Map {
self.map_tasks.lock().unwrap()
} else {
self.reduce_tasks.lock().unwrap()
};
for task in tasks.iter_mut() {
if task.task_id == task_id {
task.status = TaskStatus::Success;
}
}
}
}
关于rust - 如何在 Rust 中正确改变互斥体后面的向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75414372/