Hi rustaceans! What are you working on this week? Did you discover something new, you want to share?

  • PlexSheep
    link
    fedilink
    arrow-up
    5
    ·
    7 months ago

    The whole code is here

    (It does not compile right now)

    I understand why it does not work, but I don’t know how to achieve what I’m looking for.

    This is the code snippet from the binary:

        let wl = BuiltinWList::default();
        let builder: GameBuilder<'_, BuiltinWList> = game::Game::builder(&wl)
            .length(cli.length)
            .max_steps(cli.max_steps)
            .precompute(cli.precompute);
        let solver: AnyBuiltinSolver<'_, BuiltinWList> = cli.solver.to_solver(&wl);
        let bench = BuiltinBenchmark::build(&wl, solver, builder, cli.threads)?;
        trace!("{bench:#?}");
    
        bench.start()?;
    
        loop {
            sleep_ms(1000);
            println!("{}", bench.report());
            if bench.is_finished() {
                break;
            }
        }
    
        Ok(())
    }
    

    From the CI

    error[E0521]: borrowed data escapes outside of method
      --> src/bench/builtin.rs:79:18
       |
    23 |   impl<'wl, WL, SL> Benchmark<'wl, WL, SL> for BuiltinBenchmark<'wl, WL, SL>
       |        --- lifetime `'wl` defined here
    ...
    75 |       fn start(&'wl self, n: usize) -> WResult<()> {
       |                --------- `self` is a reference that is only valid in the method body
    ...
    79 |           let th = std::thread::spawn(move||{
       |  __________________^
    80 | |             Self::bench(n, report, solver, builder)
    81 | |         });
       | |          ^
       | |          |
       | |__________`self` escapes the method body here
       |            argument requires that `'wl` must outlive `'static`
    error[E0597]: `builder` does not live long enough
      --> src/bench/mod.rs:54:32
       |
    21 | pub trait Benchmark<'wl, WL, SL>: Sized + Debug + Sync
       |                     --- lifetime `'wl` defined here
    ...
    51 |             .for_each_with(report.clone(), |outside_data, _i| {
       |                                            ------------------ value captured here
    ...
    54 |                     .play(&mut builder.build().expect("could not create game"))
       |                                ^^^^^^^----------------------------------------
       |                                |
       |                                borrowed value does not live long enough
       |                                argument requires that `builder` is borrowed for `'wl`
    ...
    62 |     }
       |      - `builder` dropped here while still borrowed