私は小さなゲームをコーディングしています。私にはモンスターのベクトルがあり、モンスターは他のすべてのモンスターにダメージを与えることができます。私はすべてのモンスターのベクトルと攻撃しているモンスターへの参照を取る関数が必要です。ベクトルの要素への参照を、そのベクトルと一緒に関数のパラメータとして渡します。
私は、Rustのタイプシステムではこれが不可能な理由を理解しています:ベクトルとモンスターへの変更可能な参照を変更可能な参照が必要ですが、モンスターがベクターに属しているため不可能です。私は回避策を見つけることができません。
struct Monster {
life: i32,
}
// give 1 damage to all except me
// increase my life by 1
fn give_1_damage(me: &mut Monster, all: &mut Vec<Monster>) {
for m in all {
m.life -= 1;
}
me.life += 2;
}
fn main() {
let mut a = vec![Monster { life: 3 }, Monster { life: 3 }];
let ref mut b = &mut a[0];
give_1_damage(b, &mut a);
}
Lukas Kalbertodt proposesベクター内のモンスターのオフセットを渡すことができます。これは素晴らしい、ありがとう!しかし、実際に私のコードは複雑です:
struct Monster {
life: i32,
}
struct Game {
player1: Vec<Monster>,
player2: Vec<Monster>,
}
fn give_1_damage(player_idx: usize, monster_idx: usize, game: &mut Game) {
// ...
}
私はそれがプレーヤーのインデックス、およびモンスターのインデックスを渡すことが可能だということを知っているが、私は、これは醜いですました。 player_idx
とmonster_idx
を実際に渡す必要がありますが、私は以前にどのモンスターが攻撃しているかを知っていましたが、私はそれを参照することができますか?
あなたのフォローアップの質問は何の違いもなく、あなたはLukasやDKと同じ機能を呼び出すことができます。実際に配列であれば 'give_1_damage(0、&mut game.player1);または' give_1_damage(0、&mut game.players [player_idx]); – Shepmaster
関連していないので、[なぜ文字列(&String)かVec(&Vec)への参照を関数の引数として受け入れることをお勧めしませんか?](http://stackoverflow.com/q/40006219/155423) – Shepmaster