【问题标题】:How do I capture mutable variables?如何捕获可变变量?
【发布时间】:2013-08-09 02:49:50
【问题描述】:
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;    
}

有没有我可以使用的 self 参数?因为 gm 本身应该像

这样在闭包中可用
do gm.default_game_loop(){
        let level = self.lvl;    
}

【问题讨论】:

    标签: rust


    【解决方案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 完成修改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-16
      • 1970-01-01
      • 1970-01-01
      • 2014-07-11
      • 1970-01-01
      • 1970-01-01
      • 2018-04-22
      相关资源
      最近更新 更多