Great things about Rust that aren't just performance
Language design & expressiveness
- Many praise Rust as a “bag of sensible defaults”: move-by-default, immutable-by-default, exhaustive
match, integrated testing, and strong enums + pattern matching. - Traits (inspired by Haskell type classes more than OOP interfaces) are seen as a major win over deep inheritance hierarchies.
- Some dislike move-by-default ergonomics, but others argue it prevents C++-style lifetime bugs and forces clear ownership.
- Implicit returns from the last expression in a block divide opinion; some see them as coherent with “everything is an expression,” others prefer explicit
return.
Type system, safety, and error handling
- The borrow checker and ownership model are repeatedly cited as the headline feature, enabling fearless refactoring and strong guarantees without huge test suites.
- Option/Result-style error handling is preferred by many over C++ exceptions, though there’s debate:
- Critics note that plain
?-based flows lack stack traces or context unless extra libraries (e.g., anyhow) or backtraces are used. - Pro-exception voices emphasize automatic stack traces and richer diagnostic info; others respond that RAII and explicit error types avoid exception footguns.
- Critics note that plain
- Rust does not prevent memory leaks; commenters distinguish “memory safety” (no UAF, double free, data races) from leaks, which remain possible and occur in real Rust projects.
Tooling, ecosystem, and dependencies
- Cargo,
rustdoc, consistent formatting, and strong diagnostics are widely admired; some compare favorably against C++ build tooling and Go’s documentation tools. - Crate explosion (hundreds of transitive deps) worries some, invoking npm comparisons; others argue Rust’s ecosystem learned from npm’s mistakes and that microcrates centralize auditing.
- Docs.rs’s own large dependency tree is noted as a service concern rather than a language one.
Concurrency & smart pointers
- Rust’s
Send/Synctraits,Arc,Mutex, and move semantics enforce that you can’t get unsynchronized mutable access from multiple threads in safe code. - Discussion clarifies that
Mutexitself doesn’t add pointer indirection;Arcdoes due to heap allocation.
Use cases, performance, and DX
- Many use Rust for systems, data processing (e.g., Polars), and performance-critical components; some find web backends and async Rust ergonomically weak and slow to compile.
- Others prefer higher-level languages (Kotlin, C#, TypeScript, Python+type checkers) for general app development, citing faster iteration, GC, or richer IDE support.
- Several emphasize that Rust reduces but does not eliminate the need for tests; some see compile-time errors as “ultra-fast unit tests.”
Community & culture
- Enthusiasm for Rust is strong, but some perceive parts of the community as overzealous or dogmatic.
- Overall sentiment: Rust is not perfect or universal, but its safety guarantees, refactorability, and tooling make its trade-offs attractive for many domains.