最初に各人が数字を一つ決めて、ある人から時計まわりに「自分の数字に前の人の数字を足し、その和の一の位を新たに自分の数字とする」という「操作」を繰り返すゲームがあるとして、それを実装するとすれば単純に考えると
Rust
1 let mut players: Vec<i64> = vec![1, 2, 3, 4, 5]; 2 3 let mut prev = players[players.len() - 1]; 4 for x in players.iter_mut() { 5 *x += prev; 6 *x %= 10; 7 prev = *x; 8 } 9 println!("{:?}", players);
このようになるのですが、これだと一巡した後の結果しか表示できません。
ゲームとしては「操作」が一回行われるごとに画面に各人の情報を表示したいのですが(たとえば「自分の数字が0になった人は脱落」というルールを加えるとすると、ゲームの進行を見せるために画面の更新は一回の「操作」ごとに行われるほうが自然だと思います)、
Rust
1 for x in players.iter_mut() { 2 *x += prev; 3 *x %= 10; 4 prev = *x; 5 println!("{:?}", players); 6 }
とするのでは Rust の借用チェッカが満足しません。「操作」一回ごとに全体を出力するためには
Rust
1 for i in 0..players.len() { 2 players[i] += prev; 3 players[i] %= 10; 4 prev = players[i]; 5 println!("{:?}", players); 6 }
というようにミュータブルな参照を限定的にしか取らない(C言語的な)ループを使用するしかないのでしょうか?
あるいはこのような場合にループを利用することは不適切なのでしょうか。
Rust のバージョン
$ rustup show Default host: x86_64-unknown-linux-gnu installed toolchains -------------------- stable-x86_64-unknown-linux-gnu nightly-x86_64-unknown-linux-gnu (default) active toolchain ---------------- nightly-x86_64-unknown-linux-gnu (default) rustc 1.17.0-nightly (62eb6056d 2017-02-15)
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/03/16 06:52
2017/03/16 07:46