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

    • PlexSheep@infosec.pub
      link
      fedilink
      arrow-up
      5
      ·
      6 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