• 2 Posts
  • 177 Comments
Joined 2 years ago
cake
Cake day: November 13th, 2023

help-circle
  • It pushes your code to be very tree-shaped

    This is basically where my learning took me. I had to develop this notion that there was a preferred directionality to ownership and data flow, like “grain” in a piece of wood. Everything is easier if you go with the grain. “Tree-shaped” works too, since it basically is the call graph of a (single threaded) program.

    The point where I realized all this was when I tried to do a very Python/JS-brained thing: return a closure from a function. The moment you try to “curry” values into the closure, you have to “move” them to solve for ownership, lest you bring timelines into the picture. Which isn’t always what you want in a generic and reusable function. And sure enough, the standard lib and other popular libraries want you to pass a closure to functions instead.


  • This was my experience too, until I learned a few things.

    • If you’re coming from another programming language, the equivalent capabilities you’re probably used to are Box, dyn, and Rc.
    • Dynamic dispatch (dyn) isn’t really necessary a lot of the time. Identify where you absolutely need it and solve everything else through other means.
    • You wind up with lifetime specifier problems if you try to do a lot with references (&). Instead, try to re-think your structs and functions using composition and clone/copy instead. It’s less efficient, but it’s easier to optimize a running program, too.
    • Rust enum, match, if let, and ? are weird, but are where you get the most leverage in the language. Try to master them.
    • derive[...] is a first-class feature with a lot of standard lib support. Always use this to make your custom types mesh with the standard lib more seamlessly.
    • If you are experienced with the “Design Patterns” book, you absolutely need this: https://rust-unofficial.github.io/patterns/intro.html
    • Macros are an advanced feature, but help get you around limitations in generics and the type system in general. it really is worth knowing, and like the preprocessor in C/C++, isn’t avoidable at the intermediate level.
    • The compiler digs deep into your code to figure out types where they’re not explicitly declared. I’ve seen it reach into the return type, call-spec, and function calls within that function, to figure out types for things. This is very hard to observe without an IDE that’s checking syntax on the fly. Lean into both of those for more readable and maintainable code.
    • if and match are expressions, not statements! You can use either block to evaluate to a single value, useful in composite expressions like let. Example; let x=if y>20 { y } else { 0 }; Or use them to return values from functions (w/o need of a return statement).

  • I will say this: for me, learning rust was 80% un-learning habits from other languages.

    People tend to not like it when they have to change habits, especially if those took a long (and painful) time to acquire.

    In this particular case, this is the same complaint Go faced with its form of explicit error handling. And Java, for that matter.

    Honestly, Rust does a killer job of avoiding checked exceptions and verbose error hooks by way of the ? operator, and requiring all possible match branches to be accounted for. If you embrace errors fully, by using Result<> and custom Error types, your program gets a massive boost in robustness for not a lot of fuss. I recently learned that it gets even better if you embrace enum as a way to define error values, and make sure it implements useful traits like From and Display. With that, error handling code gets a lot more succinct, permitting one to more easily sift through different error values after a call (should you need to). All of that capability far exceeds any perception of clunkyness, IMO.














  • Dry, salty, black olives. Best paired with a light beer and a blazing-hot summer day.

    Pickled jalapenos are just fantastic. Hot, sour, flavorful, and just versatile at ‘waking up’ all kinds of food.

    Capers are great on all kinds of savory dishes where you want a little salt and sourness, but other pickles would just be overkill.

    Canned black olives belong on pizza, and the occasional loaded nacho plate. They’re kind of awful in other applications.

    As for the classic dill pickle, ever had one in Dr. Pepper?




  • Hot take: Most of Anime right now is far removed from the remaining unpalatable options these days. Every time I look at what’s on offer for live-action streaming, it’s either “reality TV” garbage, or some post-apocalyptic hellscape filled with graphic violence and PTSD inducing plot points. And it’s been like this for years at this point.

    Meanwhile, even the most violent Anime on offer has the make-believe veneer of animation over it, which is enough for a lot of us to not get triggered. The rest is either thought-provoking, a good feels-trip, or just slice-of-life stuff. It’s nice.


  • For a lot of people in suburbia, the entire concept of indoor “third spaces” is mostly “pay to play” at the end of a drive. A big exception to this is/were shopping malls, but those aren’t always close by. To get to more a functional social fabric, we have to provide more convenient ways of interfacing with our neighbors that don’t always require money to change hands.

    Perhaps this is a predictably orange-pill response, but we need to change zoning in a big way. Each suburban development has the street plan and infrastructure to support small businesses and common spaces, walking-distance from everyone’s front door. All it takes is to allow small-scale commercial development in corners of these collections of tract-homes and, just like that, you can have something like a functional village. Beyond that, encouraging more development of community recreation space, both indoor and outdoor, would go a long way to provide a place for people to mingle.

    Edit: strip-malls don’t count. They’re often at the very edge of residential areas, and are tied up with way more capital than what I’m talking about. That’s why they’re made up of franchises, require ridiculous amounts of parking, and contribute to “stroads” and all the knock-on effects and hostile architecture that requires.