mirror of
https://github.com/rust-unofficial/patterns
synced 2024-11-04 18:00:27 +00:00
9d955043a4
Mention Option::take() as an alternative to mem::replace() |
||
---|---|---|
anti_patterns | ||
idioms | ||
patterns | ||
intro.md | ||
LICENSE | ||
README.md | ||
template.md |
Rust Design Patterns
An open source repository of design patterns and idioms in the Rust programming language.
Contents
Idioms
- Constructor
- Concatenating strings with
format!
- Privacy for extensibility
- TODO stability for extensibility
- TODO trait to separate visibility of methods from visibility of data (https://github.com/sfackler/rust-postgres/blob/master/src/lib.rs#L1400)
- Collections are smart pointers
- TODO leak amplification ("Vec::drain sets the Vec's len to 0 prematurely so that mem::forgetting Drain "only" mem::forgets more stuff. instead of exposing uninitialized memory or having to update the len on every iteration")
- Finalisation in destructors
- TODO interior mutability - UnsafeCell, Cell, RefCell
- Iterating over an
Option
- TODO
Default
trait - Pass variables to closure
mem::replace(_)
to avoid needless clones
Design patterns
- Builder
- RAII guards
- Newtype
- TODO iterators (to safely avoid bounds checks)
- TODO closures and lifetimes (coupling to lifetime)
- TODO platform-specific sub-modules (https://github.com/rust-lang/rfcs/blob/master/text/0517-io-os-reform.md#platform-specific-opt-in)
- Entry API
- Visitor
- Fold
- TODO small crates and semver
- TODO extension traits
- TODO destructor bombs (ensure linear typing dynamically, e.g.,
0f25ccb7c3
) - TODO convertible to Foo trait for more generic generics (e.g., http://static.rust-lang.org/doc/master/std/fs/struct.File.html#method.open)
- Late bound bounds
- TODO 'shadow' borrowed version of struct - e.g., double buffering, Niko's parser generator
- TODO composition of structs to please the borrow checker
- TODO
Error
traits andResult
forwarding - TODO graphs
- Compose structs together for better borrowing
Anti-patterns
- TODO thread + catch_panic for exceptions
- TODO Clone to satisfy the borrow checker
- Deref polymorphism
- TODO Matching all fields of a struct (back compat)
- TODO wildcard matches
- TODO taking an enum rather than having multiple functions
- TODO
unwrap()
ing everyResult
instead of forwarding it
Contributing
Contributions are very welcome!
You should start with the template. Copy it into the appropriate directory, edit it, and submit a PR. You might not want every section, and you might want to add extra sections.
We suggest leaving a comment on the issue tracker so that other people don't start working on the same topic.
Correction and elaboration PRs are very welcome.