this post was submitted on 03 Aug 2023
10 points (100.0% liked)
Rust Programming
8172 readers
20 users here now
founded 5 years ago
MODERATORS
you are viewing a single comment's thread
view the rest of the comments
view the rest of the comments
Taking a quick look at the changes, most of the changed code is in a block, not a function. I know the argument to
Box::pin
looks like a function, but it's actually an async block. So you don't have a function to return from.An anonymous function is introduced with an argument list surrounded by pipe characters (
|
) which you don't have here. OTOH a block is introduced with curly braces. It is very common to use a block as the body of an anonymous function so it's easy to mix those up.A block introduces a new variable scope. It can have keyword modifiers,
async
andmove
, as you have here. The entire block is a value which is determined by the last expression in the block.That's a long way of saying: delete the
return
keyword, and remove the semicolon from the same line. That makes the value you want the last expression in theif
body, which makes that become the value of theif
expression, which then becomes the value of the block.ahh, I tried removing the return, but forgot the original .await line had no semicolon.. Thank you!
Also worth mentioning, but you can early-return from a block in rust too, just using the
break
keyword and named blocks:Edit: I haven't tried this with
async
blocks, but I'm guessing it works there too?Flow control like return and break work differently in async blocks. They are much closer to closures than blocks in this regard. And need to be as they are lazily evaluated (like closures) and may even be evaluated well after the code that contains them has finished.
Looks like labels don't work on
async
blocks, but using a nested inner block does work. Also, yeah,async
blocks only exist to createFuture
s, they don't execute until you start polling them. I don't really see any reason why you couldn't stick a label on the async block itself though, breaking would at worst just create one new state for the future - early returned.