2017-07-02 20 views
-1

私はtcod-rsを使用しています。 RootConsoleに描画するために使用された各メソッドは、のという可変参照を取ります。中央のループは、ウィンドウが閉じられるのを待って、画面をクリアし、描画してから、フラッシュするwhileループです。 「ウィンドウクローズのチェック」メソッドもまた、変更可能な参照を取ります。 clearおよびflushでもあります。借用/所有権

fn draw(root: &mut RootConsole) { /* Do state-y stuff */ } 
while !root.window_closed() /* Mutable borrow 1 */ { 
    root.clear(); // Mutable borrow 2 
    draw(root); // Mutable borrow 3 
    root.flush(); // Mutable borrow 4 
} 

コンパイラはRootConsole Sを盗む外国人について叫んで神経衰弱を持っている:それは描くことができますので、私は変更可能な参照を必要とするカスタム描画機能を持っています。私はそれが示唆した変更を加えるだけで、1つのエラーに減らすことができました。私はtcod-rsライブラリを変更することはできません。少なくとも、私はむしろそうしたくありません。私はそれを使い続けたいと考えています。たとえばdraw(root)機能をroot.put_char(...)に置き換えると動作します。

これは私がcargo runにしようとするエラーです。 tcod::console::Rootタイプのドキュメントはhereです。

error[E0596]: cannot borrow immutable argument `root` as mutable 
    --> src/draw/mod.rs:27:33 
    | 
9 | pub fn draw_map(root: &mut RootConsole, world: WorldState) { 
    |     ---- consider changing this to `mut root` 
... 
27 |     .draw_char(&mut root, 
    |         ^^^^ cannot borrow mutably 

私の実際のdraw_mapコードは非常に単純です:

pub trait DrawChar { 
    fn draw_char(self, root: &mut RootConsole, pos: (i32, i32)); 
} 

pub fn draw_map(root: &mut RootConsole, world: WorldState) { 
    let screen_start_y = world.screen.1; 
    let screen_end_y = screen_start_y + root.height(); 

    let screen_start_x = world.screen.0; 
    let screen_end_x = screen_start_x + root.width(); 

    let x = screen_start_x; 
    let y = screen_start_y; 
    for scan_line in &world.map[screen_start_y as usize.. 
           screen_end_y as usize] 
    { 
     y += 1; 
     for unit in &scan_line[screen_start_x as usize.. 
           screen_end_x as usize] 
     { 
      x += 1; 
      unit.tiles[world.level as usize] 
       .draw_char(&mut root, 
          (x as i32 - screen_start_x, 
          y as i32 - screen_start_y)); 
     } 
    } 
} 

各タイルは、それがTCOD-RSから関数を使用しているためルート上のは、変更可能な参照を必要とし、DrawCharを実装します。私のメインループは、いくつかのネイティブ関数を使用してキーコマンドを処理する点を除いて、上記のwhileループとほとんど変わりません。

+5

'draw(root);'呼び出しは、文の最後に借用が終了するため、エラーを引き起こしてはいけません。あなたが行っているエラーを示す[MCVE](https://stackoverflow.com/help/mcve)を投稿できますか? –

+0

私は1つを考えようとします。 –

+2

少なくとも、実際のエラーは送信してください。しかし、理想的には、そのエラーを生成するコードを投稿してください。 –

答えて

3

で問題が発生しています。 rootはすでにRootConsoleへの変更可能な参照です。 draw_char可変参照rootに渡そうとしています。これは基本的にという可変参照への参照になります。RootConsole単にパラメータとしてrootを渡すだけで済みます。

+0

私は明らかにこれのための構文を理解していませんでした。ありがとうございました! –

関連する問題