Как вернуться из нескольких слоев в стек вызовов? - PullRequest
1 голос
/ 08 января 2020

Предположим, у нас есть игра l oop, в соответствии с этим Python псевдокодом

def handle_events():
    for e in get_frame_events():
        if e.type == CloseEvent:
            raise SuccessfulExit()

def gameloop():
    while True:
        handle_events()
        handle_physics()
        render()

def main():
    try: gameloop()
    except SuccessfulExit: return

Мы можем выйти из программы из handle_events, разматывая стек и вызывая все деструкторы. , Если бы стек вызовов до handle_events был глубже, было бы непрактично возвращать логическое значение, указывающее, должна ли программа завершить работу полностью до main.

Я знаю process::exit, но он довольно хар sh и не вызывает деструкторов, а сразу выходит. Можно ли сделать что-то подобное в коде выше в Rust?

1 Ответ

2 голосов
/ 08 января 2020

Вернуть ошибку и сопоставить ее с ошибкой в ​​основной функции:

#[derive(Debug)]
enum Error {
    SuccessfulExit,
}

fn handle_events() -> Result<(), Error> {
    // for e in get_frame_events() {
        // if e.kind == CloseEvent {
            return Err(Error::SuccessfulExit);
        // }
    // }

    // Ok(())
}

fn gameloop() -> Result<(), Error> {
    loop {
        handle_events()?;
        // handle_physics();
        // render();
    }
}

fn main() {
    match gameloop() {
        Ok(()) | Err(Error::SuccessfulExit) => return,
        Err(e) => eprintln!("Error: {:?}", e),
    }
}

Технически, вы также можете вызвать pani c и затем поймать его, но это ужасная идея.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...