gpt4 book ai didi

rust - 如何捕获可变变量?

转载 作者:行者123 更新时间:2023-11-29 08:09:02 25 4
gpt4 key购买 nike

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;
}

最佳答案

您遇到的问题是您不能在两个任务之间直接共享内存。处理这个问题的传统方法是将数据移动到线程。这是一个例子:

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 完成修改。 channel ,或通过互斥锁保护 extra::arc::RWArc .

关于rust - 如何捕获可变变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18139407/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com