Some Rust libraries are like oil and water, they just don't mix. With the async runtime tokio
and the data-parallelism library rayon
, I learned it the hard way.
Naming is hard
These days saw the release of nolife 0.4
, a crate that offers an intuitive fix for borrow errors by letting you conveniently store a scope of execution containing multiple borrows inside of your struct without a lifetime. I want to seize this opportunity to write a bit about what goes into making a library that juggles self-referential code like nolife
does.
Some patterns are only made practical thanks to Rust's memory safety, and too dangerous to use in C++. Here's a concrete example.
Naming is hard. After all, it is one of the two hard problems of computer science, with cache invalidation and off-by-one errors.
Mostly we would assume that poorly chosen type and variable names would merely make the code harder to read, but turns out they can lead to undefined behaviour, too. And no, I'm not talking about the reserved identifiers in C (I mean, who would use _Foo
or __init__
as identifiers? Nonsense!), but rather something a bit more subtle.