rust - 如何归还两个借用的 RefCell 的组合?

标签 rust iterator borrowing

我有一个包含两个 Vec 的结构,它们被包裹在 RefCell 中。我想在该结构上有一个方法,它结合了两个向量并将它们作为新的 RefCellRefMut 返回:

use std::cell::{RefCell, RefMut};

struct World {
    positions: RefCell<Vec<Option<Position>>>,
    velocities: RefCell<Vec<Option<Velocity>>>,
}

type Position = i32;
type Velocity = i32;

impl World {
    pub fn new() -> World {
        World {
            positions: RefCell::new(vec![Some(1), None, Some(2)]),
            velocities: RefCell::new(vec![None, None, Some(1)]),
        }
    }

    pub fn get_pos_vel(&self) -> RefMut<Vec<(Position, Velocity)>> {
        let mut poses = self.positions.borrow_mut();
        let mut vels = self.velocities.borrow_mut();

        poses
            .iter_mut()
            .zip(vels.iter_mut())
            .filter(|(e1, e2)| e1.is_some() && e2.is_some())
            .map(|(e1, e2)| (e1.unwrap(), e2.unwrap()))
            .for_each(|elem| println!("{:?}", elem));
    }
}

fn main() {
    let world = World::new();

    world.get_pos_vel();
}

如何将矢量的压缩内容作为新的 RefCell 返回?这可能吗?

我知道有 RefMut::map(),我尝试嵌套对 map 的两次调用,但没有成功。

最佳答案

您希望能够修改位置和速度。如果这些必须存储在两个单独的 RefCell 中,如何回避问题并使用回调来进行修改?

use std::cell::RefCell;

struct World {
    positions: RefCell<Vec<Option<Position>>>,
    velocities: RefCell<Vec<Option<Velocity>>>,
}

type Position = i32;
type Velocity = i32;

impl World {
    pub fn new() -> World {
        World {
            positions: RefCell::new(vec![Some(1), None, Some(2)]),
            velocities: RefCell::new(vec![None, None, Some(1)]),
        }
    }

    pub fn modify_pos_vel<F: FnMut(&mut Position, &mut Velocity)>(&self, mut f: F) {
        let mut poses = self.positions.borrow_mut();
        let mut vels = self.velocities.borrow_mut();

        poses
            .iter_mut()
            .zip(vels.iter_mut())
            .filter_map(|pair| match pair {
                (Some(e1), Some(e2)) => Some((e1, e2)),
                _ => None,
            })
            .for_each(|pair| f(pair.0, pair.1))
    }
}

fn main() {
    let world = World::new();

    world.modify_pos_vel(|position, velocity| {
        // Some modification goes here, for example:
        *position += *velocity;
    });
}

关于rust - 如何归还两个借用的 RefCell 的组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56778049/

相关文章:

generics - 在不指定具体关联类型的情况下别名特征边界

rust - 将带有可变引用的匹配放入函数时出现生命周期问题

java - 为什么编译器没有发现 ConcurrentModificationException 的某些原因

rust - 预期的绑定(bind)生命周期参数,找到具体的生命周期

pointers - 引用和框之间的可变性差异

c++ - std::upper_bound 中的 boost::transform_iterator 编译错误

java - 以优雅的方式检查两个参数是否为 null

rust - 使用方法调用结果时的多个可变借用

rust - 如何读取和修改链接树中节点的值?

rust - 借的时候值(value)暂时下降,但我不想出租