Reject C, return to assembly. Structured programming is the true oppression our generation never talks about.
Ogeon
A closure may/will try to capture by reference, so it may hold references to the calling function's scope. For example, this would want to hold a reference to x
:
let x = 0;
std::thread::spawn(|| x += 1);
It's as if you had a struct like this:
struct MyClosure<'a> {
x: &'a mut i32,
}
That makes the closure non-'static
, since it holds non-'static
references. The usual solution is to use the move
keyword, to hint that you want it to move by default, or to use scoped threads. But yeah Send
and 'static
depend on the captures.
Am I correct in guessing that you handle is of Gontian origin?
Yes! 😁 I picked it when I used to play Tibia (15-20 years ago!), and it stuck with me since then. The correct spelling was already taken, so I modified it a bit. This name is usually available.
Your guess is correct, it should be understood as
F: ( FnOnce() -> T ) + Send + 'static
T: Send + 'static
The FnOnce() -> T
is syntax sugar for FnOnce<(), Output = T>
and the bounds after apply to F
. That's also why T
has separate bounds. They aren't propagated or inherited. It's just an ambiguous looking syntax, but T + Trait + 'lifetime
isn't a valid syntax for applying bounds to T
(unless I missed something).
The type F
may be a closure over values from the calling thread. It has to be possible to send these values to the spawned thread, hence F
needs Send + 'static
. When the thread is done with its work, it returns a value of type T
that gets passed back via JoinHandle<T>
, so T
needs Send + 'static
too.
I hope this cleared things up a bit.
Det är ändå redan för sent. Det är buskens hus nu.
That's definitely part of "the deal" with MIT and Apache. The other end of it is that they shouldn't really expect to get anything more than what the authors are willing to give.
Right, there may be too many unknowns involved. 🤔
Option<T>
has a From<T>
implementation that lets you write Option::from($file_path).map(|path| path.to_string())
to accept both cases in the same expression.
https://doc.rust-lang.org/std/option/enum.Option.html#impl-From%3CT%3E-for-Option%3CT%3E
Zooming in? In this economy?!
"Search prompt engineer"
A relatively cheap PC with Factorio and you are set. You won't spend much on food either, so win-win.