2017-07-02 41 views
-1

我使用TCOD-RS。用於繪製到RootConsole每個方法都需要一個可變引用。中央迴路是while循環,等待窗口關閉,並清除屏幕,畫,然後刷新。 「檢查窗口關閉」方法也需要一個可變引用。 clearflush也是。我有一個需要一個可變參考自定義繪圖功能,因此可以得出:鏽借貸/所有權

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秒。我已經設法通過進行修改來減少它的一個錯誤。我不能更改tcod-rs庫,或者至少,我寧願不要,我寧願繼續使用它。例如,用root.put_char(...)代替draw(root)函數,可以工作。

這裏是我得到試圖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)); 
     } 
    } 
} 

每一瓦片實現DrawChar,其中,因爲它使用的功能從TCOD-RS 根,需要一個可變引用。我的主循環與上面的while循環沒有什麼不同,除了它使用一些本地函數處理關鍵命令。

+5

調用'畫(根);'不應該導致錯誤,因爲借將在語句的結束而終止。你可以發佈一個[MCVE](https://stackoverflow.com/help/mcve)來顯示你收到的錯誤嗎? –

+0

我會嘗試拿出一個。 –

+2

至少發佈實際錯誤。但理想情況下發布產生該錯誤的代碼。 –

回答

3

的問題是在draw_mapdraw_char電話。 root已經是RootConsole的可變引用;你想傳遞給draw_char一個可變引用root,基本上成爲一個可變參考一可變引用RootConsole。只需通過root作爲參數,你就完成了。

+0

好的。顯然,我並沒有真正理解這個語法。謝謝! –