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

  • @[email protected]
    link
    fedilink
    58 months ago

    I’m still working on a benchmark for my wordle solver. The thing itself works, but I want it to print statuses while benching.

    I cannot do it. I’ve spent hours on this, even tried to make the bench async and run it in a separate Tokio task. I cannot share my bench strict over a thread, and cloning is impossible too, because of something.

    Sometimes, the lifetime and ownership stuff of rust really gets annoying. C would’ve just done the stuff and be done with it. (Maybe)

      • @[email protected]
        link
        fedilink
        58 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