99d9ccd547
Go from ``` error[E0495]: cannot infer an appropriate lifetime due to conflicting requirements --> file8.rs:22:5 | 22 | / move || { 23 | | *dest = g.get(); 24 | | } | |_____^ | note: first, the lifetime cannot outlive the anonymous lifetime #1 defined on the function body at 18:1... --> file8.rs:18:1 | 18 | / fn bat<'a, G: 'a, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ + 'a 19 | | where 20 | | G: Get<T> 21 | | { ... | 24 | | } 25 | | } | |_^ note: ...so that the types are compatible --> file8.rs:22:5 | 22 | / move || { //~ ERROR cannot infer an appropriate lifetime 23 | | *dest = g.get(); 24 | | } | |_____^ = note: expected `&mut T` found `&mut T` note: but, the lifetime must be valid for the lifetime `'a` as defined on the function body at 18:8... --> file8.rs:18:8 | 18 | fn bat<'a, G: 'a, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ + 'a | ^^ note: ...so that return value is valid for the call --> file8.rs:18:45 | 18 | fn bat<'a, G: 'a, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ + 'a | ^^^^^^^^^^^^^^^^^^^^^^^ ``` to ``` error[E0621]: explicit lifetime required in the type of `dest` --> file8.rs:18:45 | 18 | fn bat<'a, G: 'a, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ + 'a | ------ ^^^^^^^^^^^^^^^^^^^^^^^ lifetime `'a` required | | | help: add explicit lifetime `'a` to the type of `dest`: `&'a mut T` ```
101 lines
1.9 KiB
Rust
101 lines
1.9 KiB
Rust
pub trait Get<T> {
|
|
fn get(self) -> T;
|
|
}
|
|
|
|
struct Foo {
|
|
x: usize,
|
|
}
|
|
|
|
impl Get<usize> for Foo {
|
|
fn get(self) -> usize {
|
|
self.x
|
|
}
|
|
}
|
|
|
|
fn foo<G, T>(g: G, dest: &mut T) -> impl FnOnce()
|
|
where
|
|
G: Get<T>
|
|
{
|
|
move || { //~ ERROR cannot infer an appropriate lifetime
|
|
*dest = g.get();
|
|
}
|
|
}
|
|
|
|
// After applying suggestion for `foo`:
|
|
fn bar<G, T>(g: G, dest: &mut T) -> impl FnOnce() + '_
|
|
//~^ ERROR the parameter type `G` may not live long enough
|
|
where
|
|
G: Get<T>
|
|
{
|
|
move || {
|
|
*dest = g.get();
|
|
}
|
|
}
|
|
|
|
|
|
// After applying suggestion for `bar`:
|
|
fn baz<G: 'a, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ //~ ERROR undeclared lifetime
|
|
where
|
|
G: Get<T>
|
|
{
|
|
move || {
|
|
*dest = g.get();
|
|
}
|
|
}
|
|
|
|
// After applying suggestion for `baz`:
|
|
fn qux<'a, G: 'a, T>(g: G, dest: &mut T) -> impl FnOnce() + '_
|
|
//~^ ERROR the parameter type `G` may not live long enough
|
|
where
|
|
G: Get<T>
|
|
{
|
|
move || {
|
|
*dest = g.get();
|
|
}
|
|
}
|
|
|
|
// After applying suggestion for `qux`:
|
|
fn bat<'a, G: 'a, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ + 'a
|
|
//~^ ERROR explicit lifetime required in the type of `dest`
|
|
where
|
|
G: Get<T>
|
|
{
|
|
move || {
|
|
*dest = g.get();
|
|
}
|
|
}
|
|
|
|
// Potential incorrect attempt:
|
|
fn bak<'a, G, T>(g: G, dest: &'a mut T) -> impl FnOnce() + 'a
|
|
//~^ ERROR the parameter type `G` may not live long enough
|
|
where
|
|
G: Get<T>
|
|
{
|
|
move || {
|
|
*dest = g.get();
|
|
}
|
|
}
|
|
|
|
|
|
// We need to tie the lifetime of `G` with the lifetime of `&mut T` and the returned closure:
|
|
fn ok<'a, G: 'a, T>(g: G, dest: &'a mut T) -> impl FnOnce() + 'a
|
|
where
|
|
G: Get<T>
|
|
{
|
|
move || {
|
|
*dest = g.get();
|
|
}
|
|
}
|
|
|
|
// This also works. The `'_` isn't necessary but it's where we arrive to following the suggestions:
|
|
fn ok2<'a, G: 'a, T>(g: G, dest: &'a mut T) -> impl FnOnce() + '_ + 'a
|
|
where
|
|
G: Get<T>
|
|
{
|
|
move || {
|
|
*dest = g.get();
|
|
}
|
|
}
|
|
|
|
fn main() {}
|