Borrow Checker 2 @WaffleLapkin @BoxyUwU
Warning: this quiz is still "work-in-progress", some questions might not have good explanations (or any at all), formatting/structure/titles/etc are not final, and so on. You might want to return here on a later date.
fn main() {
consume_fn(identity);
}
fn identity(x: &u32) -> &u32 {
x
}
fn consume_fn<T>(_: impl FnOnce(&u32) -> T) {}
Solution
error[E0308]: mismatched types
--> examples/borrowck_2.rs:2:5
|
2 | consume_fn(identity);
| ^^^^^^^^^^^^^^^^^^^^ one type is more general than the other
|
= note: expected reference `&_`
found reference `&_`
note: the lifetime requirement is introduced here
--> examples/borrowck_2.rs:9:42
|
9 | fn consume_fn<T>(_: impl FnOnce(&u32) -> T) {}
| ^
For more information about this error, try `rustc --explain E0308`.
error: could not compile `code` (example "borrowck_2") due to 1 previous error
identity returns a reference with the same lifetime as the argument, i.e. it's for<'a> fn(&'a u32) -> &'a u32.
consume_fn accepts some function with a signature of for<'a> fn(&'a u32) -> T where T is some type.
Notably, T is defined outside of the binder (aka "for all" qualifier, for<'a>), so it can't name 'a, causing the error.