Effective Rust
Preface
1.
Types
1.1.
Item 1: Use the type system to express your data structures
1.2.
Item 2: Use the type system to express common behavior
1.3.
Item 3: Prefer Option and Result transforms over explicit match expressions
1.4.
Item 4: Prefer idiomatic Error types
1.5.
Item 5: Understand type conversions
1.6.
Item 6: Embrace the newtype pattern
1.7.
Item 7: Use builders for complex types
1.8.
Item 8: Familiarize yourself with reference and pointer types
1.9.
Item 9: Consider using iterator transforms instead of explicit loops
2.
Traits
2.1.
Item 10: Familiarize yourself with standard traits
2.2.
Item 11: Implement the Drop trait for RAII patterns
2.3.
Item 12: Understand the trade-offs between generics and trait objects
2.4.
Item 13: Use default implementations to minimize required trait methods
3.
Concepts
3.1.
Item 14: Understand lifetimes
3.2.
Item 15: Understand the borrow checker
3.3.
Item 16: Avoid writing unsafe code
3.4.
Item 17: Be wary of shared-state parallelism
3.5.
Item 18: Don't panic
3.6.
Item 19: Avoid reflection
3.7.
Item 20: Avoid the temptation to over-optimize
4.
Dependencies
4.1.
Item 21: Understand what semantic versioning promises
4.2.
Item 22: Minimize visibility
4.3.
Item 23: Avoid wildcard imports
4.4.
Item 24: Re-export dependencies whose types appear in your API
4.5.
Item 25: Manage your dependency graph
4.6.
Item 26: Be wary of feature creep
5.
Tooling
5.1.
Item 27: Document public interfaces
5.2.
Item 28: Use macros judiciously
5.3.
Item 29: Listen to Clippy
5.4.
Item 30: Write more than unit tests
5.5.
Item 31: Take advantage of the tooling ecosystem
5.6.
Item 32: Set up a continuous integration (CI) system
6.
Beyond Standard Rust
6.1.
Item 33: Consider making library code no_std compatible
6.2.
Item 34: Control what crosses FFI boundaries
6.3.
Item 35: Prefer bindgen to manual FFI mappings
Afterword
Index
Light
Rust
Coal
Navy
Ayu
Effective Rust
Effective Rust
35 Specific Ways to Improve Your Rust Code
David Drysdale