logoalt Hacker News

Rucadilast Friday at 11:02 PM3 repliesview on HN

This is also somewhat common in c++ with immediate-invoked lambdas


Replies

jeroenhdyesterday at 1:00 AM

The same pattern can also be useful in Rust for early returning Result<_,_> errors (you cannot `let x = foo()?` inside of a normal block like that).

    let config: Result<i32, i32> = {
        Ok(
            "1234".parse::<i32>().map_err(|_| -1)?
        )
    };
would fail to compile, or worse: would return out of the entire method if surrounding method would have return type Result<_,i32>. On the other hand,

    let config: Result<i32, i32> = (||{
        Ok(
            "1234".parse::<i32>().map_err(|_| -1)?
        )
    })();
runs just fine.

Hopefully try blocks will allow using ? inside of expression blocks in the future, though.

carstimonyesterday at 12:01 AM

A blog post for it from a prominent c++er https://herbsutter.com/2013/04/05/complex-initialization-for...

knorkeryesterday at 8:43 AM

Yeah but languages that make you resort to this then don't let you simply return from the block.

And the workarounds often make the pattern be a net loss in clarity.