質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

Q&A

0回答

400閲覧

Rustでselfを可変として扱う関数内から不可変として扱う関数を呼び出したい。あるいは他の解決策を知りたい。

skuralll

総合スコア0

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

0グッド

1クリップ

投稿2023/01/11 16:01

前提

Rustでライフゲームを作成しようとしています。
盤面を管理する構造体Boardを作成し、メンバ関数を実装したところエラーが発生しました。
どうやらstep関数内でselfが可変のものとして使用されているのにもかかわらず、selfを不可変なものとして扱うget_cell関数を関数内で呼び出している為エラーが出力されるようです。
エラーの原因はわかったのですが、上手い解決法が見つからない為、ご教授願いたいです。

実現したいこと

メンバ関数stepからget_cell関数を呼び出せるようにしたい。
あるいは他の解決策を知りたい。

発生している問題・エラーメッセージ

error[E0502]: cannot borrow `*self` as immutable because it is also borrowed as mutable --> src/game.rs:65:44 | 59 | for cell in self.cells.iter_mut(){ | --------------------- | | | mutable borrow occurs here | mutable borrow later used here ... 65 | if let Some(around_cell) = self.get_cell(x, y){ | ^^^^^^^^^^^^^^^^^^^ immutable borrow occurs here

該当のソースコード

rust//セル

1pub struct cell { 2 // 座標 3 x: i32, 4 y: i32, 5 // 生死 6 value: bool, 7} 8 9//盤面 10pub struct Board{ 11 // サイズ 12 width: i32, 13 height: i32, 14 // セルを格納するベクタ 15 cells: Vec<cell>, 16} 17 18const AROUND_POS: [(i32, i32); 8] = [ 19 (-1, -1), 20 (-1, 0), 21 (-1, 1), 22 (0, -1), 23 (0, 1), 24 (1, -1), 25 (1, 0), 26 (1, 1), 27]; 28 29impl Board { 30 // 盤面を新規生成する 31 pub fn new(width: i32, height: i32) -> Board { 32 let mut cells = Vec::new(); 33 for y in 0..height { 34 for x in 0..width { 35 cells.push(cell{x: x, y: y, value: false}); 36 } 37 } 38 Self {cells: cells, width: width, height: height} 39 } 40 41 //指定の座標のセルを取得する 42 pub fn get_cell(&self, x: i32, y: i32) -> Option<&cell> { 43 //両端を繋げないための処理 44 if 0 > x && x >= self.width { 45 return None; 46 } 47 //セルが存在していれば返す 48 if let Some(cell) = self.cells.get( (x + y*self.width) as usize) { 49 Some(cell) 50 } 51 else{ 52 None 53 } 54 } 55 56 // 1ステップ進める 57 pub fn step(&mut self){ 58 for cell in self.cells.iter_mut(){ 59 //周りの生存セル数をカウントする 60 let mut around_count = 0; 61 for pos in AROUND_POS.iter(){ 62 let x = cell.x + pos.0; 63 let y = cell.y + pos.1; 64 if let Some(around_cell) = self.get_cell(x, y){ 65 if around_cell.value{ 66 around_count += 1; 67 } 68 } 69 } 70 // 生死判定 71 if cell.value{ 72 // 生存セル 73 if around_count < 2 || around_count > 3{ 74 // 過疎or過密 75 cell.value = false; 76 } 77 } 78 else{ 79 // 死亡セル 80 if around_count == 3{ 81 // 誕生 82 cell.value = true; 83 } 84 } 85 } 86 } 87}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問