28 karma · joined July 8, 2022
They also create lock files with hashes by default.
pip still doesn't use lock files. It's subpar compared to other ecosystems.
But if you are speaking about ergonomics of handling Options, it is being improved upon with the usage of try operators with Options as well as possibly seeing try expressions in the near future.
I don't think lack of ergonomics is a good justification for usage of unwrap, but that is entirely subjective. However, I do see the misappropriation of `unwrap` as a signal that the ergonomics in Rust are lacking and it's something that needs to be addressed, so again I do sympathize.
See these for reference
* https://kotlinlang.org/docs/null-safety.html
* https://dart.dev/null-safety
* https://docs.microsoft.com/en-us/dotnet/csharp/nullable-refe...
An orthogonal approach would be using a data type such as Maybe or Option, but ergonomics depends on language.
I agree, I love Rust, but I'd like to see error handling ergonomics improved.
I'd like to see error handling become more like Zig or Swift.
Until then, I cope with the `anyhow` and `thiserror` crate :|
It sounds like this is coming from a C++ bias? So please forgive me if this is wrong.
Rust, in my experience, favors move semantics first, then copy semantics after.
I know in C++, we had implicit copy constructors, with move semantics after with rvalue references, where you need to use `std::move` in a lot of cases.
So what helps, in my opinion, is to think of Rust as using `std::move` as a default.
Basically I'm encoding this approach in Java.
My wishlist for Java is for null to be illegal for all types unless they are encoded as nullable such as `T?`.
Until then, I just use Kotlin and/or Scala when I require JVM.
interface Numeric<T> {
T zero();
T add(T a, T b);
}
static <T> T sum(Numeric<T> n, T[] v) {
T summer = n.zero();
for (int k = 0; k < v.length; k++) {
summer = n.add(summer, v[k]);
}
return summer;
}