【发布时间】:2021-06-30 23:23:18
【问题描述】:
考虑这个“战斗”两个随机“玩家”的玩具示例:
#[derive(Clone)]
struct Player {
name: String,
health: i32,
attack: i32,
}
fn fight(player_a: &mut Player, player_b: &mut Player) {
player_a.health -= player_b.attack;
player_b.health -= player_a.attack;
}
fn main() {
// Create Vector of 100 new players
let players: Vec<Player> = vec![
Player {
name: String::new(),
health: 100,
attack: 5,
};
100
];
// Pick two "random" indices
let i1 = 19;
let i2 = 30;
fight(&mut players[i1], &mut players[i2]); // Error!
}
此代码将不起作用,因为 fight 函数需要对同一 players 向量的元素进行两个可变引用。
我的丑陋解决方法目前如下所示,使用RefCell:
use std::cell::RefCell;
let mut players: Vec<RefCell<Player>> = vec![];
for _ in 0..100 {
players.push(RefCell::new(Player {
name: String::new(),
health: 100,
attack: 5,
}));
}
fight(&mut players[i1].borrow_mut(), &mut players[i2].borrow_mut());
我想知道是否有更有效的方法来避免RefCell 的额外开销?我可以以某种方式利用split_at_mut 吗?
【问题讨论】:
标签: rust borrow-checker refcell