Content
@
0 reply
0 recast
0 reaction
Agost Biro
@agostbiro
Let’s try a more difficult one with closures. What’s wrong with this closure let closure = |x: &str| x;
6 replies
0 recast
4 reactions
franco
@francos.eth
You would need to specify a lifetime since you’re returning a borrowed reference. I don’t remember right now if you can annotate lifetimes in closures 😅 but you could do: let closure = |x: &str| x.to_owned();
2 replies
0 recast
1 reaction
Agost Biro
@agostbiro
Very warm! Why does this work though? fn foo(s: &str) -> &str { s }
2 replies
0 recast
1 reaction
franco
@francos.eth
Lifetime elision rules. The param s gets a lifetime because its a ref, since there is only one input lifetime it gets assigned to the output. I don’t get why the same doesn’t apply to the closure though. Maybe depends on the context of the closure and how its used 🤔
1 reply
0 recast
1 reaction
Agost Biro
@agostbiro
Yes! This is a wart on closures: lifetime elision works different than for functions for historical reasons and it’s impossible to change it without breaking backwards compatibility. One possible fix is static ref with trait: let c: &dyn Fn(&str) -> &str = &|x: &str| x;
1 reply
0 recast
1 reaction