• 15 Posts
  • 667 Comments
Joined 6 years ago
cake
Cake day: May 31st, 2020

help-circle

  • In many cases, you don’t need an equivalent to finally, because the cleanup is automatically handled via the Drop trait, which runs cleanup code when the object is freed from memory (similar to “destructors” in some other languages).
    Because of Rust’s whole ownership thingamabob, it’s generally entirely deterministic when this code will run (at the closing brace for the scope in which the object is defined, unless you pass that object outside of that scope).

    In other cases, you don’t need a finally, because nothing forces you to bubble up errors instantly. You can make a call which fails, store the error in a variable, run your cleanup steps and then return the error at the end of you function.

    Sometimes, however, you do want to bubble up errors right away (via ? or early return), typically so you can group them together and handle them all the same.
    In that case, you can run the cleanup code in the calling function. If you don’t to want to make it the responsibility of the caller, then pull out a small function within your function, so that you become the caller of that small function and can do the cleanup steps at the end of your function, while you do the bubbling within the smaller function.
    There’s also ways to make that less invasive via closures (which also serve as a boundary to which you can bubble errors), but those are somewhat complex in Rust, due to the whole ownership thingamabob.

    I will say, I do sometimes feel like Rust could use a better way to handle doing something before the error bubbles up. But generally speaking, I don’t feel like a finally is missing.


  • You can use the anyhow crate for something quite similar to exceptions: https://crates.io/crates/anyhow

    In terms of how it actually fits into Rust, you want to use anyhow for application code. If you’re writing a library, then anyhow is a no-go, because users cannot match on different error classes with it. (Much like you would want custom exception classes, so that users can catch them in different catch branches and handle them differently.)

    Every so often, you will also need matchable error classes within your application code, then you would have to replace anyhow with a custom error type there, too, of course.

    I will also say, IMHO it is fine to use anyhow even while you’re learning Rust. It is so easy that you kind of skip learning error handling, which you will need to learn at some point, but you can still do that when you actually need it.






  • Back in 2010, the OpenOffice devs had to abandon that name for trademark reasons¹, so they renamed to LibreOffice and continued developing under that name.

    OpenOffice theoretically also still exists, but it’s hardly getting updates. Unless you specifically like software from 2010 (including some security vulnerabilities, I believe), you want to use LibreOffice.

    ¹) The OpenOffice trademark was owned by Sun Microsystems, which got bought by Oracle. Oracle has a very bad reputation, so the devs did not care to wait around for Oracle to fuck everything up.


  • Ephera@lemmy.mltoMemes@sopuli.xyzGames then vs now
    link
    fedilink
    English
    arrow-up
    3
    ·
    3 days ago

    My personal interpretation was the guy is just overly tan and potentially covered in mud, because he’s so tough and runs around on battlegrounds all day long.

    Well, and the color palette is gray-brown in general, because we had an abundance of those, especially military shooters in the early HD era.

    But yeah, who knows, could also be that the post originated from 4chan or the like and is just racist.


  • Ephera@lemmy.mltoMemes@sopuli.xyzGames then vs now
    link
    fedilink
    English
    arrow-up
    3
    ·
    edit-2
    3 days ago

    Earlier today, I signed up to a service and immediately got the “Become a member” badge.

    Well, and I had signed up to upvote an existing post, so I also got the “Team player” badge in the same moment, for that singular upvote I had made…





  • We deployed a client software in a Docker container on Windows 10. It could not connect to the backend, even though we saw SYN packages originating from it.
    So, we ran WireShark on the Windows host and saw that the SYN-ACK packages from the backend were arriving there, too, but no ACK came through to complete the TCP handshake.

    Eventually, we rolled out a network debugging container on that Windows host and then could see in the tcpdump, that the SYN-ACK packages, which arrived on the Windows host, just did not show up in the container. Hyper-V or something was quietly dropping them.

    Other network connections were working fine, just the SYN-ACK from our backend triggered this.







  • Yeah, we always try to automate as much as possible with generic language build tooling and scripts, so that ideally the call in the runner is just a single command, which can also be triggered locally.

    Unfortunately, if you want to be able to re-run intermediate steps, then you do need to inform the runner of what you’re doing and deal with the whole complexity of up-/downloading intermediate results.