Search code examples
rustclosurestraitslifetime

Why does `|_| 1` not meet lifetime requirements


I have the following trait and generic implementation for Fn:

trait Provider<'a> {
    type Out;
    fn get(&'a self, state: &State) -> Self::Out;
}

impl<'a, F, T> Provider<'a> for F
where
    F: Fn(&State) -> T,
{
    type Out = T;

    fn get(&'a self, state: &State) -> T {
        self(state)
    }
}

Now, I have some code that wants a for<'a> Provider<'a, Out = usize>. However, the most simple closure, |_| 1, does not qualify and instead provides this error message which I don't understand:

fn assert_usize_provider<P>(_: P)
where
    P: for<'a> Provider<'a, Out = usize>,
{
}

fn main() {
    assert_usize_provider(|_| 1);
}
error[E0308]: mismatched types
  --> src/main.rs:27:5
   |
27 |     assert_usize_provider(|_| 1);
   |     ^^^^^^^^^^^^^^^^^^^^^ lifetime mismatch
   |
   = note: expected type `FnOnce<(&State,)>`
              found type `FnOnce<(&State,)>`
note: this closure does not fulfill the lifetime requirements
  --> src/main.rs:27:27
   |
27 |     assert_usize_provider(|_| 1);
   |                           ^^^^^
note: the lifetime requirement is introduced here
  --> src/main.rs:22:29
   |
22 |     P: for<'a> Provider<'a, Out = usize>,
   |                             ^^^^^^^^^^^

Playground link

Can someone explain what that error message means and how to get this code working?


Solution

  • I don't know why inference does not work in this case but you can add type annotation to get the code working.

    assert_usize_provider(|_ : &State| 1);