policy: Add section on returning Self

Returning `Self` instead of the actual type makes refactoring easier,
especially for error enums.
This commit is contained in:
Tobin C. Harding 2023-12-14 09:21:06 +11:00
parent 8afa379f39
commit 472da02c58
No known key found for this signature in database
GPG Key ID: 40BF9E4C269D6607
1 changed files with 43 additions and 0 deletions

View File

@ -255,6 +255,49 @@ pub use {
}
```
#### Return `Self`
Use `Self` as the return type instead of naming the type. When constructing the return value use
`Self` or the type name, whichever you prefer.
```rust
/// A counter that is always smaller than 100.
pub struct Counter(u32);
impl Counter {
/// Constructs a new `Counter`.
pub fn new() -> Self { Self(0) }
/// Returns a counter if it is possible to create one from x.
pub fn maybe(x: u32) -> Option<Self> {
match x {
x if x >= 100 => None,
c => Some(Counter(c)),
}
}
}
impl TryFrom<u32> for Counter {
type Error = TooBigError;
fn try_from(x: u32) -> Result<Self, Self::Error> {
if x >= 100 {
return Err(TooBigError);
}
Ok(Counter(x))
}
}
```
When constructing the return value for error enums use `Self`.
```rust
impl From<foo::Error> for LongDescriptiveError {
fn from(e: foo::Error) -> Self { Self::Foo(e) }
}
```
#### Errors
Return as much context as possible with errors e.g., if an error was encountered parsing a string