about summary refs log tree commit diff
path: root/docs/dev
diff options
context:
space:
mode:
Diffstat (limited to 'docs/dev')
-rw-r--r--docs/dev/style.md27
1 files changed, 27 insertions, 0 deletions
diff --git a/docs/dev/style.md b/docs/dev/style.md
index 17626f3fdc5..cc06d41221e 100644
--- a/docs/dev/style.md
+++ b/docs/dev/style.md
@@ -144,6 +144,20 @@ fn foo() {
 In the "Not as good" version, the precondition that `1` is a valid char boundary is checked in `is_string_literal` and used in `foo`.
 In the "Good" version, the precondition check and usage are checked in the same block, and then encoded in the types.
 
+When checking a boolean precondition, prefer `if !invariant` to `if negated_invariant`:
+
+```rust
+// Good
+if !(idx < len) {
+    return None;
+}
+
+// Not as good
+if idx >= len {
+    return None;
+}
+```
+
 ## Getters & Setters
 
 If a field can have any value without breaking invariants, make the field public.
@@ -382,6 +396,19 @@ fn foo() -> Option<Bar> {
 }
 ```
 
+## Comparisons
+
+Use `<`/`<=`, avoid `>`/`>=`.
+Less-then comparisons are more intuitive, they correspond spatially to [real line](https://en.wikipedia.org/wiki/Real_line)
+
+```rs
+// Good
+assert!(lo <= x && x <= hi);
+
+// Not as good
+assert!(x >= lo && x <= hi>);
+```
+
 ## Documentation
 
 For `.md` and `.adoc` files, prefer a sentence-per-line format, don't wrap lines.