rust - 如何初始化相互引用的结构字段

标签 rust

我目前想为 Piston 定义一个结构使用 GamerIterator 的游戏:

pub struct MyGame<'a> {
    game_window: GameWindowGLFW,
    game_iter: GameIterator<'a, GameWindowGLFW>,
    //...
}

GameIteratorGameWindow 中是通用的及其生命周期。我想告诉编译器它与字段“game_window”/“整个结构”具有相同的生命周期,并省略结构的生命周期。

我也很难初始化这个:

MyGame {
    game_window: GameWindowGLFW::new(GameWindowSettings {/*...*/},
    game_iter: GameIterator::new(&mut game_window, &game_iter_settings), // game_window cannot be used here
    //...
}

我认为我可以通过使用 Option<GameIterator<...>> 解决初始化问题和一个 init() 方法,但我想避免这种情况,因为我可以保证 game_iternew() 之后出现完成。

写这个的惯用方式是什么?

最佳答案

不仅初始化有问题,如果 GameIterator 实现了 Drop,也可能存在销毁问题:编译器必须知道它需要销毁game_itergame_window 之前,否则 game_window 在运行其 drop( ) 方法。

无法将结构本身的生命周期作为生命周期参数传递。您唯一可以做的就是从 MyGame 中删除 game_window 字段并将 GameWindowGLFW 实例传递给 MyGame 的初始值设定项。如果您想封装它以便用户不需要创建 GameWindowGLFW,您可以编写一个方法来创建 GameWindowGLFWMyGame 并调用一个仅接受 MyGame 参数的闭包。

pub struct MyGame<'a> {
    game_iter: GameIterator<'a, GameWindowGLFW>,
    //...
}

impl<'a> MyGame<'a> {
    fn new(game_window: &'a mut GameWindowGLFW) -> MyGame<'a> {
        MyGame {
            game_iter: GameIterator { game_window: game_window },
        }
    }
}

fn start_game(callback: |game: &mut MyGame|) {
    let mut game_window = GameWindowGLFW;
    let mut game = MyGame::new(&mut game_window);
    callback(&mut game);
}

fn main() {
    start_game(|game| {
        /* use game here */
    });
}

关于rust - 如何初始化相互引用的结构字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31093330/

相关文章:

vector - 为什么 &[T] 参数也接受 &Vec<T>?

rust - 为什么 Rust 书中的多线程 Web 服务器示例无法编译?

rust - 从 Rust 调用 OpenACC 代码不在 GPU 上运行

rust - 如何获取Rayon的par_chunks_mut中的chunk index

reference - 有没有办法返回对函数中创建的变量的引用?

rust - 返回一个改变其环境的闭包

ios - 如何为 iOS 创建 Rust 动态库 (dylib)?

string - 是否有 String::chars 的自有版本?

rust - 惯用地处理 TcpStream 或 SslStream

rust - 不能在循环中以可变的形式借用