2013-08-09 2 views
2
struct Level{ 
    i_vec: ~[int] 
} 
pub struct GameManager{ 
    lvl: Level 
} 
impl GameManager { 
    pub fn new() -> GameManager{ 
     GameManager {lvl: Level{i_vec: ~[]}} 
    } 
    pub fn new_game(f: ~fn()) { 
     do spawn { 
      f(); 
     } 
    } 
    pub fn default_game_loop(lvl: &Level ,f: &fn()){ 
     loop { 
      f(); 
      break; 
     } 
    } 
} 
fn main() { 
    let mut gm = GameManager::new(); 
    do GameManager::new_game(){ 
     // I know I could move "gm" here, but I would like 
     // to know how to capture mutable variables. 
     do GameManager::default_game_loop(&gm.lvl){ 

     } 
    } 

} 
/* 
/home/maik/source/test.rs:28:43: 28:45 error: mutable variables cannot be implicitly captured 
/home/maik/source/test.rs:28   do GameManager::default_game_loop(&gm.lvl){ 
                     ^~ 
error: aborting due to previous error 
[Finished in 0.2s with exit code 101] 
*/ 

가변 변수를 어떻게 캡처합니까?가변 변수를 어떻게 캡처합니까?

는 또한 이러한 기능의 방법을 만들려고하지만

do gm.default_game_loop(){ 
    let level = &gm.lvl;  
} 

내가 사용할 수있는 자체 매개 변수가 거기에 같은 폐쇄에 자신을 이동하려고하기 때문에 다음 모든 파산? gm 자체가 클로저와 같이 사용할 수 있어야합니다.

do gm.default_game_loop(){ 
     let level = self.lvl;  
} 

답변

1

문제는 두 작업간에 메모리를 직접 공유 할 수 없다는 것입니다. 이것을 처리하는 전통적인 방법은 스레드로 데이터를 이동하는 것입니다. 예를 들면 다음과 같습니다.

use std::task; 

struct Level { 
    i_vec: ~[int] 
} 
pub struct GameManager { 
    lvl: Level 
} 
impl GameManager { 
    pub fn new() -> GameManager { 
     GameManager { lvl: Level { i_vec: ~[] } } 
    } 
    pub fn new_game<A: Send>(a: A, f: ~fn(A)) { 
     task::spawn_with(a, f) 
    } 
    pub fn default_game_loop(lvl: &Level, f: &fn()) { 
     loop { 
      f(); 
      break; 
     } 
    } 
} 
fn main() { 
    let mut gm = GameManager::new(); 
    do GameManager::new_game(gm) |gm| { 
     // I know I could move "gm" here, but I would like 
     // to know how to capture mutable variables. 
     do GameManager::default_game_loop(&gm.lvl) { 

     } 
    } 
} 

여러 스레드에서 가변적 인 상태를 공유해야하는 경우 좀 더 까다로운 방법입니다. 그러기 위해서는 변경 가능 상태를 소유하는 작업을 설정하고 수정은 std::comm::stream 채널을 통해 또는 뮤텍스로 보호 된 extra::arc::RWArc을 통해 수행 할 수 있습니다.