agy-superpowers 5.2.1 → 5.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +47 -150
- package/package.json +1 -1
- package/template/agent/patches/skills-patches.md +23 -0
- package/template/agent/rules/scratch-scripts.md +37 -0
- package/template/agent/rules/superpowers.md +6 -50
- package/template/agent/skills/brainstorming/SKILL.md +4 -3
- package/template/agent/skills/brainstorming/visual-companion.md +2 -3
- package/template/agent/skills/finishing-a-development-branch/SKILL.md +11 -16
- package/template/agent/skills/subagent-driven-development/SKILL.md +16 -0
- package/template/agent/skills/subagent-driven-development/implementer-prompt.md +4 -3
- package/template/agent/skills/using-git-worktrees/SKILL.md +3 -2
- package/template/agent/skills/using-superpowers/SKILL.md +8 -6
- package/template/agent/skills/using-superpowers/references/copilot-tools.md +52 -0
- package/template/agent/skills/writing-plans/SKILL.md +5 -3
- package/template/agent/skills/writing-skills/SKILL.md +1 -1
- package/template/agent/superpowers-version.json +2 -2
- package/template/agent/tmp/agent-config-backup.yml +9 -0
- package/template/agent/skills/ai-integrated-product/SKILL.md +0 -57
- package/template/agent/skills/analytics-setup/SKILL.md +0 -51
- package/template/agent/skills/api-design/SKILL.md +0 -193
- package/template/agent/skills/app-store-optimizer/SKILL.md +0 -127
- package/template/agent/skills/auth-and-identity/SKILL.md +0 -167
- package/template/agent/skills/backend-developer/SKILL.md +0 -148
- package/template/agent/skills/bootstrapper-finance/SKILL.md +0 -55
- package/template/agent/skills/chrome-extension-developer/SKILL.md +0 -53
- package/template/agent/skills/community-manager/SKILL.md +0 -115
- package/template/agent/skills/content-marketer/SKILL.md +0 -111
- package/template/agent/skills/conversion-optimizer/SKILL.md +0 -142
- package/template/agent/skills/cto-architect/SKILL.md +0 -133
- package/template/agent/skills/customer-success-manager/SKILL.md +0 -126
- package/template/agent/skills/data-analyst/SKILL.md +0 -147
- package/template/agent/skills/devops-engineer/SKILL.md +0 -117
- package/template/agent/skills/email-infrastructure/SKILL.md +0 -164
- package/template/agent/skills/game-design/SKILL.md +0 -194
- package/template/agent/skills/game-developer/SKILL.md +0 -175
- package/template/agent/skills/growth-hacker/SKILL.md +0 -122
- package/template/agent/skills/idea-validator/SKILL.md +0 -55
- package/template/agent/skills/indie-legal/SKILL.md +0 -53
- package/template/agent/skills/influencer-marketer/SKILL.md +0 -141
- package/template/agent/skills/landing-page-builder/SKILL.md +0 -59
- package/template/agent/skills/launch-strategist/SKILL.md +0 -62
- package/template/agent/skills/market-researcher/SKILL.md +0 -53
- package/template/agent/skills/micro-saas-builder/SKILL.md +0 -56
- package/template/agent/skills/monetization-strategist/SKILL.md +0 -119
- package/template/agent/skills/paid-acquisition-specialist/SKILL.md +0 -119
- package/template/agent/skills/pricing-psychologist/SKILL.md +0 -58
- package/template/agent/skills/real-time-features/SKILL.md +0 -194
- package/template/agent/skills/retention-specialist/SKILL.md +0 -123
- package/template/agent/skills/rust-developer/SKILL.md +0 -281
- package/template/agent/skills/rust-developer/references/rust-rules/_sections.md +0 -231
- package/template/agent/skills/rust-developer/references/rust-rules/anti-clone-excessive.md +0 -124
- package/template/agent/skills/rust-developer/references/rust-rules/anti-collect-intermediate.md +0 -131
- package/template/agent/skills/rust-developer/references/rust-rules/anti-empty-catch.md +0 -132
- package/template/agent/skills/rust-developer/references/rust-rules/anti-expect-lazy.md +0 -95
- package/template/agent/skills/rust-developer/references/rust-rules/anti-format-hot-path.md +0 -141
- package/template/agent/skills/rust-developer/references/rust-rules/anti-index-over-iter.md +0 -125
- package/template/agent/skills/rust-developer/references/rust-rules/anti-lock-across-await.md +0 -127
- package/template/agent/skills/rust-developer/references/rust-rules/anti-over-abstraction.md +0 -120
- package/template/agent/skills/rust-developer/references/rust-rules/anti-panic-expected.md +0 -131
- package/template/agent/skills/rust-developer/references/rust-rules/anti-premature-optimize.md +0 -156
- package/template/agent/skills/rust-developer/references/rust-rules/anti-string-for-str.md +0 -122
- package/template/agent/skills/rust-developer/references/rust-rules/anti-stringly-typed.md +0 -167
- package/template/agent/skills/rust-developer/references/rust-rules/anti-type-erasure.md +0 -134
- package/template/agent/skills/rust-developer/references/rust-rules/anti-unwrap-abuse.md +0 -143
- package/template/agent/skills/rust-developer/references/rust-rules/anti-vec-for-slice.md +0 -121
- package/template/agent/skills/rust-developer/references/rust-rules/api-builder-must-use.md +0 -143
- package/template/agent/skills/rust-developer/references/rust-rules/api-builder-pattern.md +0 -187
- package/template/agent/skills/rust-developer/references/rust-rules/api-common-traits.md +0 -165
- package/template/agent/skills/rust-developer/references/rust-rules/api-default-impl.md +0 -177
- package/template/agent/skills/rust-developer/references/rust-rules/api-extension-trait.md +0 -163
- package/template/agent/skills/rust-developer/references/rust-rules/api-from-not-into.md +0 -146
- package/template/agent/skills/rust-developer/references/rust-rules/api-impl-asref.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/api-impl-into.md +0 -160
- package/template/agent/skills/rust-developer/references/rust-rules/api-must-use.md +0 -125
- package/template/agent/skills/rust-developer/references/rust-rules/api-newtype-safety.md +0 -162
- package/template/agent/skills/rust-developer/references/rust-rules/api-non-exhaustive.md +0 -177
- package/template/agent/skills/rust-developer/references/rust-rules/api-parse-dont-validate.md +0 -184
- package/template/agent/skills/rust-developer/references/rust-rules/api-sealed-trait.md +0 -168
- package/template/agent/skills/rust-developer/references/rust-rules/api-serde-optional.md +0 -182
- package/template/agent/skills/rust-developer/references/rust-rules/api-typestate.md +0 -199
- package/template/agent/skills/rust-developer/references/rust-rules/async-bounded-channel.md +0 -175
- package/template/agent/skills/rust-developer/references/rust-rules/async-broadcast-pubsub.md +0 -185
- package/template/agent/skills/rust-developer/references/rust-rules/async-cancellation-token.md +0 -203
- package/template/agent/skills/rust-developer/references/rust-rules/async-clone-before-await.md +0 -171
- package/template/agent/skills/rust-developer/references/rust-rules/async-join-parallel.md +0 -158
- package/template/agent/skills/rust-developer/references/rust-rules/async-joinset-structured.md +0 -195
- package/template/agent/skills/rust-developer/references/rust-rules/async-mpsc-queue.md +0 -171
- package/template/agent/skills/rust-developer/references/rust-rules/async-no-lock-await.md +0 -156
- package/template/agent/skills/rust-developer/references/rust-rules/async-oneshot-response.md +0 -191
- package/template/agent/skills/rust-developer/references/rust-rules/async-select-racing.md +0 -198
- package/template/agent/skills/rust-developer/references/rust-rules/async-spawn-blocking.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/async-tokio-fs.md +0 -167
- package/template/agent/skills/rust-developer/references/rust-rules/async-tokio-runtime.md +0 -169
- package/template/agent/skills/rust-developer/references/rust-rules/async-try-join.md +0 -172
- package/template/agent/skills/rust-developer/references/rust-rules/async-watch-latest.md +0 -189
- package/template/agent/skills/rust-developer/references/rust-rules/doc-all-public.md +0 -113
- package/template/agent/skills/rust-developer/references/rust-rules/doc-cargo-metadata.md +0 -147
- package/template/agent/skills/rust-developer/references/rust-rules/doc-errors-section.md +0 -122
- package/template/agent/skills/rust-developer/references/rust-rules/doc-examples-section.md +0 -161
- package/template/agent/skills/rust-developer/references/rust-rules/doc-hidden-setup.md +0 -149
- package/template/agent/skills/rust-developer/references/rust-rules/doc-intra-links.md +0 -138
- package/template/agent/skills/rust-developer/references/rust-rules/doc-link-types.md +0 -169
- package/template/agent/skills/rust-developer/references/rust-rules/doc-module-inner.md +0 -116
- package/template/agent/skills/rust-developer/references/rust-rules/doc-panics-section.md +0 -128
- package/template/agent/skills/rust-developer/references/rust-rules/doc-question-mark.md +0 -136
- package/template/agent/skills/rust-developer/references/rust-rules/doc-safety-section.md +0 -131
- package/template/agent/skills/rust-developer/references/rust-rules/err-anyhow-app.md +0 -179
- package/template/agent/skills/rust-developer/references/rust-rules/err-context-chain.md +0 -144
- package/template/agent/skills/rust-developer/references/rust-rules/err-custom-type.md +0 -152
- package/template/agent/skills/rust-developer/references/rust-rules/err-doc-errors.md +0 -145
- package/template/agent/skills/rust-developer/references/rust-rules/err-expect-bugs-only.md +0 -133
- package/template/agent/skills/rust-developer/references/rust-rules/err-from-impl.md +0 -152
- package/template/agent/skills/rust-developer/references/rust-rules/err-lowercase-msg.md +0 -124
- package/template/agent/skills/rust-developer/references/rust-rules/err-no-unwrap-prod.md +0 -115
- package/template/agent/skills/rust-developer/references/rust-rules/err-question-mark.md +0 -151
- package/template/agent/skills/rust-developer/references/rust-rules/err-result-over-panic.md +0 -130
- package/template/agent/skills/rust-developer/references/rust-rules/err-source-chain.md +0 -155
- package/template/agent/skills/rust-developer/references/rust-rules/err-thiserror-lib.md +0 -171
- package/template/agent/skills/rust-developer/references/rust-rules/lint-cargo-metadata.md +0 -138
- package/template/agent/skills/rust-developer/references/rust-rules/lint-deny-correctness.md +0 -107
- package/template/agent/skills/rust-developer/references/rust-rules/lint-missing-docs.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/lint-pedantic-selective.md +0 -118
- package/template/agent/skills/rust-developer/references/rust-rules/lint-rustfmt-check.md +0 -157
- package/template/agent/skills/rust-developer/references/rust-rules/lint-unsafe-doc.md +0 -133
- package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-complexity.md +0 -131
- package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-perf.md +0 -136
- package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-style.md +0 -135
- package/template/agent/skills/rust-developer/references/rust-rules/lint-warn-suspicious.md +0 -122
- package/template/agent/skills/rust-developer/references/rust-rules/lint-workspace-lints.md +0 -172
- package/template/agent/skills/rust-developer/references/rust-rules/mem-arena-allocator.md +0 -168
- package/template/agent/skills/rust-developer/references/rust-rules/mem-arrayvec.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/mem-assert-type-size.md +0 -168
- package/template/agent/skills/rust-developer/references/rust-rules/mem-avoid-format.md +0 -147
- package/template/agent/skills/rust-developer/references/rust-rules/mem-box-large-variant.md +0 -158
- package/template/agent/skills/rust-developer/references/rust-rules/mem-boxed-slice.md +0 -139
- package/template/agent/skills/rust-developer/references/rust-rules/mem-clone-from.md +0 -147
- package/template/agent/skills/rust-developer/references/rust-rules/mem-compact-string.md +0 -149
- package/template/agent/skills/rust-developer/references/rust-rules/mem-reuse-collections.md +0 -174
- package/template/agent/skills/rust-developer/references/rust-rules/mem-smaller-integers.md +0 -159
- package/template/agent/skills/rust-developer/references/rust-rules/mem-smallvec.md +0 -138
- package/template/agent/skills/rust-developer/references/rust-rules/mem-thinvec.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/mem-with-capacity.md +0 -156
- package/template/agent/skills/rust-developer/references/rust-rules/mem-write-over-format.md +0 -172
- package/template/agent/skills/rust-developer/references/rust-rules/mem-zero-copy.md +0 -164
- package/template/agent/skills/rust-developer/references/rust-rules/name-acronym-word.md +0 -99
- package/template/agent/skills/rust-developer/references/rust-rules/name-as-free.md +0 -104
- package/template/agent/skills/rust-developer/references/rust-rules/name-consts-screaming.md +0 -94
- package/template/agent/skills/rust-developer/references/rust-rules/name-crate-no-rs.md +0 -78
- package/template/agent/skills/rust-developer/references/rust-rules/name-funcs-snake.md +0 -76
- package/template/agent/skills/rust-developer/references/rust-rules/name-into-ownership.md +0 -123
- package/template/agent/skills/rust-developer/references/rust-rules/name-is-has-bool.md +0 -127
- package/template/agent/skills/rust-developer/references/rust-rules/name-iter-convention.md +0 -129
- package/template/agent/skills/rust-developer/references/rust-rules/name-iter-method.md +0 -131
- package/template/agent/skills/rust-developer/references/rust-rules/name-iter-type-match.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/name-lifetime-short.md +0 -86
- package/template/agent/skills/rust-developer/references/rust-rules/name-no-get-prefix.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/name-to-expensive.md +0 -118
- package/template/agent/skills/rust-developer/references/rust-rules/name-type-param-single.md +0 -92
- package/template/agent/skills/rust-developer/references/rust-rules/name-types-camel.md +0 -65
- package/template/agent/skills/rust-developer/references/rust-rules/name-variants-camel.md +0 -101
- package/template/agent/skills/rust-developer/references/rust-rules/opt-bounds-check.md +0 -161
- package/template/agent/skills/rust-developer/references/rust-rules/opt-cache-friendly.md +0 -187
- package/template/agent/skills/rust-developer/references/rust-rules/opt-codegen-units.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/opt-cold-unlikely.md +0 -152
- package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-always-rare.md +0 -141
- package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-never-cold.md +0 -181
- package/template/agent/skills/rust-developer/references/rust-rules/opt-inline-small.md +0 -160
- package/template/agent/skills/rust-developer/references/rust-rules/opt-likely-hint.md +0 -171
- package/template/agent/skills/rust-developer/references/rust-rules/opt-lto-release.md +0 -130
- package/template/agent/skills/rust-developer/references/rust-rules/opt-pgo-profile.md +0 -167
- package/template/agent/skills/rust-developer/references/rust-rules/opt-simd-portable.md +0 -144
- package/template/agent/skills/rust-developer/references/rust-rules/opt-target-cpu.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/own-arc-shared.md +0 -141
- package/template/agent/skills/rust-developer/references/rust-rules/own-borrow-over-clone.md +0 -95
- package/template/agent/skills/rust-developer/references/rust-rules/own-clone-explicit.md +0 -135
- package/template/agent/skills/rust-developer/references/rust-rules/own-copy-small.md +0 -124
- package/template/agent/skills/rust-developer/references/rust-rules/own-cow-conditional.md +0 -135
- package/template/agent/skills/rust-developer/references/rust-rules/own-lifetime-elision.md +0 -134
- package/template/agent/skills/rust-developer/references/rust-rules/own-move-large.md +0 -134
- package/template/agent/skills/rust-developer/references/rust-rules/own-mutex-interior.md +0 -105
- package/template/agent/skills/rust-developer/references/rust-rules/own-rc-single-thread.md +0 -65
- package/template/agent/skills/rust-developer/references/rust-rules/own-refcell-interior.md +0 -97
- package/template/agent/skills/rust-developer/references/rust-rules/own-rwlock-readers.md +0 -122
- package/template/agent/skills/rust-developer/references/rust-rules/own-slice-over-vec.md +0 -119
- package/template/agent/skills/rust-developer/references/rust-rules/perf-black-box-bench.md +0 -153
- package/template/agent/skills/rust-developer/references/rust-rules/perf-chain-avoid.md +0 -136
- package/template/agent/skills/rust-developer/references/rust-rules/perf-collect-into.md +0 -133
- package/template/agent/skills/rust-developer/references/rust-rules/perf-collect-once.md +0 -120
- package/template/agent/skills/rust-developer/references/rust-rules/perf-drain-reuse.md +0 -137
- package/template/agent/skills/rust-developer/references/rust-rules/perf-entry-api.md +0 -134
- package/template/agent/skills/rust-developer/references/rust-rules/perf-extend-batch.md +0 -150
- package/template/agent/skills/rust-developer/references/rust-rules/perf-iter-lazy.md +0 -123
- package/template/agent/skills/rust-developer/references/rust-rules/perf-iter-over-index.md +0 -113
- package/template/agent/skills/rust-developer/references/rust-rules/perf-profile-first.md +0 -175
- package/template/agent/skills/rust-developer/references/rust-rules/perf-release-profile.md +0 -149
- package/template/agent/skills/rust-developer/references/rust-rules/proj-bin-dir.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/proj-flat-small.md +0 -133
- package/template/agent/skills/rust-developer/references/rust-rules/proj-lib-main-split.md +0 -148
- package/template/agent/skills/rust-developer/references/rust-rules/proj-mod-by-feature.md +0 -130
- package/template/agent/skills/rust-developer/references/rust-rules/proj-mod-rs-dir.md +0 -120
- package/template/agent/skills/rust-developer/references/rust-rules/proj-prelude-module.md +0 -155
- package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-crate-internal.md +0 -139
- package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-super-parent.md +0 -135
- package/template/agent/skills/rust-developer/references/rust-rules/proj-pub-use-reexport.md +0 -162
- package/template/agent/skills/rust-developer/references/rust-rules/proj-workspace-deps.md +0 -186
- package/template/agent/skills/rust-developer/references/rust-rules/proj-workspace-large.md +0 -162
- package/template/agent/skills/rust-developer/references/rust-rules/test-arrange-act-assert.md +0 -160
- package/template/agent/skills/rust-developer/references/rust-rules/test-cfg-test-module.md +0 -151
- package/template/agent/skills/rust-developer/references/rust-rules/test-criterion-bench.md +0 -171
- package/template/agent/skills/rust-developer/references/rust-rules/test-descriptive-names.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/test-doctest-examples.md +0 -168
- package/template/agent/skills/rust-developer/references/rust-rules/test-fixture-raii.md +0 -151
- package/template/agent/skills/rust-developer/references/rust-rules/test-integration-dir.md +0 -144
- package/template/agent/skills/rust-developer/references/rust-rules/test-mock-traits.md +0 -189
- package/template/agent/skills/rust-developer/references/rust-rules/test-mockall-mocking.md +0 -226
- package/template/agent/skills/rust-developer/references/rust-rules/test-proptest-properties.md +0 -161
- package/template/agent/skills/rust-developer/references/rust-rules/test-should-panic.md +0 -130
- package/template/agent/skills/rust-developer/references/rust-rules/test-tokio-async.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/test-use-super.md +0 -127
- package/template/agent/skills/rust-developer/references/rust-rules/type-enum-states.md +0 -154
- package/template/agent/skills/rust-developer/references/rust-rules/type-generic-bounds.md +0 -142
- package/template/agent/skills/rust-developer/references/rust-rules/type-never-diverge.md +0 -146
- package/template/agent/skills/rust-developer/references/rust-rules/type-newtype-ids.md +0 -160
- package/template/agent/skills/rust-developer/references/rust-rules/type-newtype-validated.md +0 -159
- package/template/agent/skills/rust-developer/references/rust-rules/type-no-stringly.md +0 -144
- package/template/agent/skills/rust-developer/references/rust-rules/type-option-nullable.md +0 -137
- package/template/agent/skills/rust-developer/references/rust-rules/type-phantom-marker.md +0 -188
- package/template/agent/skills/rust-developer/references/rust-rules/type-repr-transparent.md +0 -143
- package/template/agent/skills/rust-developer/references/rust-rules/type-result-fallible.md +0 -131
- package/template/agent/skills/saas-architect/SKILL.md +0 -139
- package/template/agent/skills/security-engineer/SKILL.md +0 -133
- package/template/agent/skills/seo-specialist/SKILL.md +0 -130
- package/template/agent/skills/solo-founder-ops/SKILL.md +0 -56
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
# name-iter-method
|
|
2
|
-
|
|
3
|
-
> Name iterator methods `iter()`, `iter_mut()`, and `into_iter()` consistently
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
Rust has a strong convention for iterator method names. Following these conventions makes your types work predictably with `for` loops and iterator adapters. Users expect `iter()` for shared references, `iter_mut()` for mutable references, and `into_iter()` for owned iteration.
|
|
8
|
-
|
|
9
|
-
## Bad
|
|
10
|
-
|
|
11
|
-
```rust
|
|
12
|
-
struct Collection<T> {
|
|
13
|
-
items: Vec<T>,
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
impl<T> Collection<T> {
|
|
17
|
-
// Non-standard names - confusing
|
|
18
|
-
fn elements(&self) -> impl Iterator<Item = &T> {
|
|
19
|
-
self.items.iter()
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
fn get_iterator(&self) -> impl Iterator<Item = &T> {
|
|
23
|
-
self.items.iter()
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
fn to_iter(self) -> impl Iterator<Item = T> {
|
|
27
|
-
self.items.into_iter()
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
## Good
|
|
33
|
-
|
|
34
|
-
```rust
|
|
35
|
-
struct Collection<T> {
|
|
36
|
-
items: Vec<T>,
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
impl<T> Collection<T> {
|
|
40
|
-
/// Returns an iterator over references.
|
|
41
|
-
fn iter(&self) -> impl Iterator<Item = &T> {
|
|
42
|
-
self.items.iter()
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/// Returns an iterator over mutable references.
|
|
46
|
-
fn iter_mut(&mut self) -> impl Iterator<Item = &mut T> {
|
|
47
|
-
self.items.iter_mut()
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// Implement IntoIterator for for-loop support
|
|
52
|
-
impl<T> IntoIterator for Collection<T> {
|
|
53
|
-
type Item = T;
|
|
54
|
-
type IntoIter = std::vec::IntoIter<T>;
|
|
55
|
-
|
|
56
|
-
fn into_iter(self) -> Self::IntoIter {
|
|
57
|
-
self.items.into_iter()
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
impl<'a, T> IntoIterator for &'a Collection<T> {
|
|
62
|
-
type Item = &'a T;
|
|
63
|
-
type IntoIter = std::slice::Iter<'a, T>;
|
|
64
|
-
|
|
65
|
-
fn into_iter(self) -> Self::IntoIter {
|
|
66
|
-
self.items.iter()
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
impl<'a, T> IntoIterator for &'a mut Collection<T> {
|
|
71
|
-
type Item = &'a mut T;
|
|
72
|
-
type IntoIter = std::slice::IterMut<'a, T>;
|
|
73
|
-
|
|
74
|
-
fn into_iter(self) -> Self::IntoIter {
|
|
75
|
-
self.items.iter_mut()
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
## Iterator Convention Summary
|
|
81
|
-
|
|
82
|
-
| Method | Receiver | Yields | Use Case |
|
|
83
|
-
|--------|----------|--------|----------|
|
|
84
|
-
| `iter()` | `&self` | `&T` | Read-only iteration |
|
|
85
|
-
| `iter_mut()` | `&mut self` | `&mut T` | In-place modification |
|
|
86
|
-
| `into_iter()` | `self` | `T` | Consuming iteration |
|
|
87
|
-
|
|
88
|
-
## For Loop Integration
|
|
89
|
-
|
|
90
|
-
```rust
|
|
91
|
-
let col = Collection { items: vec![1, 2, 3] };
|
|
92
|
-
|
|
93
|
-
// These all work with proper IntoIterator impls
|
|
94
|
-
for item in &col { // Calls (&col).into_iter() -> iter()
|
|
95
|
-
println!("{}", item); // &i32
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
for item in &mut col { // Calls (&mut col).into_iter() -> iter_mut()
|
|
99
|
-
*item += 1; // &mut i32
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
for item in col { // Calls col.into_iter()
|
|
103
|
-
process(item); // i32, consumes col
|
|
104
|
-
}
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
## Additional Iterator Methods
|
|
108
|
-
|
|
109
|
-
```rust
|
|
110
|
-
impl<T> Collection<T> {
|
|
111
|
-
// Domain-specific iterators follow similar patterns
|
|
112
|
-
|
|
113
|
-
/// Iterates over keys (for map-like structures).
|
|
114
|
-
fn keys(&self) -> impl Iterator<Item = &K> { ... }
|
|
115
|
-
|
|
116
|
-
/// Iterates over values.
|
|
117
|
-
fn values(&self) -> impl Iterator<Item = &V> { ... }
|
|
118
|
-
|
|
119
|
-
/// Iterates over mutable values.
|
|
120
|
-
fn values_mut(&mut self) -> impl Iterator<Item = &mut V> { ... }
|
|
121
|
-
|
|
122
|
-
/// Drains elements, leaving container empty.
|
|
123
|
-
fn drain(&mut self) -> impl Iterator<Item = T> { ... }
|
|
124
|
-
}
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
## See Also
|
|
128
|
-
|
|
129
|
-
- [name-as-free](./name-as-free.md) - Conversion naming conventions
|
|
130
|
-
- [api-extension-trait](./api-extension-trait.md) - Iterator extensions
|
|
131
|
-
- [api-common-traits](./api-common-traits.md) - Standard trait implementations
|
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
# name-iter-type-match
|
|
2
|
-
|
|
3
|
-
> Name iterator types after their source method
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
Iterator types should match the method that creates them. `iter()` returns `Iter`, `into_iter()` returns `IntoIter`, `keys()` returns `Keys`. This naming pattern is established by the standard library and makes types predictable.
|
|
8
|
-
|
|
9
|
-
## Standard Library Pattern
|
|
10
|
-
|
|
11
|
-
```rust
|
|
12
|
-
// Vec
|
|
13
|
-
impl<T> Vec<T> {
|
|
14
|
-
fn iter(&self) -> Iter<'_, T> { } // Returns Iter
|
|
15
|
-
fn iter_mut(&mut self) -> IterMut<'_, T> { } // Returns IterMut
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
impl<T> IntoIterator for Vec<T> {
|
|
19
|
-
type IntoIter = IntoIter<T>; // Returns IntoIter
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
// HashMap
|
|
23
|
-
impl<K, V> HashMap<K, V> {
|
|
24
|
-
fn iter(&self) -> Iter<'_, K, V> { }
|
|
25
|
-
fn keys(&self) -> Keys<'_, K, V> { } // Returns Keys
|
|
26
|
-
fn values(&self) -> Values<'_, K, V> { } // Returns Values
|
|
27
|
-
fn drain(&mut self) -> Drain<'_, K, V> { } // Returns Drain
|
|
28
|
-
}
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
## Implementation
|
|
32
|
-
|
|
33
|
-
```rust
|
|
34
|
-
mod my_collection {
|
|
35
|
-
pub struct MyCollection<T> {
|
|
36
|
-
items: Vec<T>,
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
// Iterator types in same module
|
|
40
|
-
pub struct Iter<'a, T> {
|
|
41
|
-
inner: std::slice::Iter<'a, T>,
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
pub struct IterMut<'a, T> {
|
|
45
|
-
inner: std::slice::IterMut<'a, T>,
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
pub struct IntoIter<T> {
|
|
49
|
-
inner: std::vec::IntoIter<T>,
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
impl<T> MyCollection<T> {
|
|
53
|
-
pub fn iter(&self) -> Iter<'_, T> {
|
|
54
|
-
Iter { inner: self.items.iter() }
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
pub fn iter_mut(&mut self) -> IterMut<'_, T> {
|
|
58
|
-
IterMut { inner: self.items.iter_mut() }
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
impl<T> IntoIterator for MyCollection<T> {
|
|
63
|
-
type Item = T;
|
|
64
|
-
type IntoIter = IntoIter<T>;
|
|
65
|
-
|
|
66
|
-
fn into_iter(self) -> IntoIter<T> {
|
|
67
|
-
IntoIter { inner: self.items.into_iter() }
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
// Implement Iterator for each type
|
|
72
|
-
impl<'a, T> Iterator for Iter<'a, T> {
|
|
73
|
-
type Item = &'a T;
|
|
74
|
-
fn next(&mut self) -> Option<Self::Item> {
|
|
75
|
-
self.inner.next()
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
impl<'a, T> Iterator for IterMut<'a, T> {
|
|
80
|
-
type Item = &'a mut T;
|
|
81
|
-
fn next(&mut self) -> Option<Self::Item> {
|
|
82
|
-
self.inner.next()
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
impl<T> Iterator for IntoIter<T> {
|
|
87
|
-
type Item = T;
|
|
88
|
-
fn next(&mut self) -> Option<Self::Item> {
|
|
89
|
-
self.inner.next()
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
## Naming Convention
|
|
96
|
-
|
|
97
|
-
| Method | Iterator Type |
|
|
98
|
-
|--------|---------------|
|
|
99
|
-
| `iter()` | `Iter` |
|
|
100
|
-
| `iter_mut()` | `IterMut` |
|
|
101
|
-
| `into_iter()` | `IntoIter` |
|
|
102
|
-
| `keys()` | `Keys` |
|
|
103
|
-
| `values()` | `Values` |
|
|
104
|
-
| `values_mut()` | `ValuesMut` |
|
|
105
|
-
| `drain()` | `Drain` |
|
|
106
|
-
| `chunks()` | `Chunks` |
|
|
107
|
-
| `windows()` | `Windows` |
|
|
108
|
-
|
|
109
|
-
## Custom Iterator Methods
|
|
110
|
-
|
|
111
|
-
```rust
|
|
112
|
-
impl Graph {
|
|
113
|
-
// Method name -> Type name
|
|
114
|
-
fn nodes(&self) -> Nodes<'_> { } // Custom: Nodes
|
|
115
|
-
fn edges(&self) -> Edges<'_> { } // Custom: Edges
|
|
116
|
-
fn neighbors(&self, node: NodeId) -> Neighbors<'_> { } // Custom: Neighbors
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
pub struct Nodes<'a> { /* ... */ }
|
|
120
|
-
pub struct Edges<'a> { /* ... */ }
|
|
121
|
-
pub struct Neighbors<'a> { /* ... */ }
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
## Bad
|
|
125
|
-
|
|
126
|
-
```rust
|
|
127
|
-
// Mismatched names
|
|
128
|
-
impl MyCollection<T> {
|
|
129
|
-
fn iter(&self) -> MyCollectionIterator<'_, T> { } // Should be Iter
|
|
130
|
-
fn keys(&self) -> KeyIterator<'_, K> { } // Should be Keys
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
// Generic names that don't match method
|
|
134
|
-
pub struct Iterator<T>; // Conflicts with std::iter::Iterator
|
|
135
|
-
pub struct I<T>; // Too cryptic
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
## See Also
|
|
139
|
-
|
|
140
|
-
- [name-iter-convention](./name-iter-convention.md) - iter/iter_mut/into_iter
|
|
141
|
-
- [name-iter-method](./name-iter-method.md) - Iterator method names
|
|
142
|
-
- [api-common-traits](./api-common-traits.md) - Implementing common traits
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
# name-lifetime-short
|
|
2
|
-
|
|
3
|
-
> Use short, conventional lifetime names: `'a`, `'b`, `'de`, `'src`
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
Lifetime parameters are ubiquitous in Rust signatures. Short names like `'a` keep signatures readable. For domain-specific lifetimes, descriptive but short names like `'src` or `'de` communicate intent without clutter. The Rust community has established conventions that aid recognition.
|
|
8
|
-
|
|
9
|
-
## Bad
|
|
10
|
-
|
|
11
|
-
```rust
|
|
12
|
-
// Overly verbose lifetimes
|
|
13
|
-
fn parse<'input_lifetime, 'output_lifetime>(
|
|
14
|
-
input: &'input_lifetime str
|
|
15
|
-
) -> Result<&'output_lifetime str, Error> { ... }
|
|
16
|
-
|
|
17
|
-
// Meaningless long names
|
|
18
|
-
struct Parser<'parser_instance_lifetime> {
|
|
19
|
-
source: &'parser_instance_lifetime str,
|
|
20
|
-
}
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
## Good
|
|
24
|
-
|
|
25
|
-
```rust
|
|
26
|
-
// Standard short lifetimes
|
|
27
|
-
fn parse<'a>(input: &'a str) -> Result<&'a str, Error> { ... }
|
|
28
|
-
|
|
29
|
-
struct Parser<'a> {
|
|
30
|
-
source: &'a str,
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
// Multiple lifetimes: 'a, 'b, 'c
|
|
34
|
-
fn merge<'a, 'b>(first: &'a str, second: &'b str) -> String { ... }
|
|
35
|
-
|
|
36
|
-
// Descriptive when clarity helps
|
|
37
|
-
fn deserialize<'de>(input: &'de [u8]) -> Result<Value<'de>, Error> { ... }
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
## Common Lifetime Conventions
|
|
41
|
-
|
|
42
|
-
| Lifetime | Convention | Example |
|
|
43
|
-
|----------|------------|---------|
|
|
44
|
-
| `'a` | Generic, first lifetime | `fn foo<'a>(x: &'a str)` |
|
|
45
|
-
| `'b` | Generic, second lifetime | `fn bar<'a, 'b>(x: &'a T, y: &'b U)` |
|
|
46
|
-
| `'de` | Deserialization | serde's `Deserialize<'de>` |
|
|
47
|
-
| `'src` | Source code/input | `struct Lexer<'src>` |
|
|
48
|
-
| `'ctx` | Context | `struct Query<'ctx>` |
|
|
49
|
-
| `'input` | Input data | `struct Parser<'input>` |
|
|
50
|
-
| `'static` | Static lifetime | `&'static str` |
|
|
51
|
-
|
|
52
|
-
## Elision Preferred
|
|
53
|
-
|
|
54
|
-
```rust
|
|
55
|
-
// Let elision work when possible
|
|
56
|
-
fn first_word(s: &str) -> &str { // Not fn first_word<'a>(s: &'a str) -> &'a str
|
|
57
|
-
s.split_whitespace().next().unwrap_or("")
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
impl User {
|
|
61
|
-
fn name(&self) -> &str { // Elision handles this
|
|
62
|
-
&self.name
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
## Serde Convention
|
|
68
|
-
|
|
69
|
-
```rust
|
|
70
|
-
use serde::{Deserialize, Serialize};
|
|
71
|
-
|
|
72
|
-
// 'de is the standard serde lifetime for borrowed data
|
|
73
|
-
#[derive(Deserialize)]
|
|
74
|
-
struct Request<'de> {
|
|
75
|
-
#[serde(borrow)]
|
|
76
|
-
name: &'de str,
|
|
77
|
-
#[serde(borrow)]
|
|
78
|
-
tags: Vec<&'de str>,
|
|
79
|
-
}
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
## See Also
|
|
83
|
-
|
|
84
|
-
- [own-lifetime-elision](./own-lifetime-elision.md) - When to omit lifetimes
|
|
85
|
-
- [name-type-param-single](./name-type-param-single.md) - Type parameter naming
|
|
86
|
-
- [own-borrow-over-clone](./own-borrow-over-clone.md) - Borrowing patterns
|
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
# name-no-get-prefix
|
|
2
|
-
|
|
3
|
-
> Omit get_ prefix for simple getters
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
Rust convention omits the `get_` prefix for simple field access. Methods like `len()`, `name()`, `value()` are cleaner than `get_len()`, `get_name()`, `get_value()`. This follows the principle of making the common case concise.
|
|
8
|
-
|
|
9
|
-
The `get` prefix is reserved for methods that DO something beyond simple field access.
|
|
10
|
-
|
|
11
|
-
## Bad
|
|
12
|
-
|
|
13
|
-
```rust
|
|
14
|
-
struct User {
|
|
15
|
-
name: String,
|
|
16
|
-
age: u32,
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
impl User {
|
|
20
|
-
fn get_name(&self) -> &str { // Verbose
|
|
21
|
-
&self.name
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
fn get_age(&self) -> u32 { // Verbose
|
|
25
|
-
self.age
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
fn get_is_adult(&self) -> bool { // Doubly verbose
|
|
29
|
-
self.age >= 18
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
let name = user.get_name();
|
|
34
|
-
let age = user.get_age();
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
## Good
|
|
38
|
-
|
|
39
|
-
```rust
|
|
40
|
-
struct User {
|
|
41
|
-
name: String,
|
|
42
|
-
age: u32,
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
impl User {
|
|
46
|
-
fn name(&self) -> &str { // Clean
|
|
47
|
-
&self.name
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
fn age(&self) -> u32 { // Clean
|
|
51
|
-
self.age
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
fn is_adult(&self) -> bool { // Boolean uses is_ prefix
|
|
55
|
-
self.age >= 18
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
let name = user.name();
|
|
60
|
-
let age = user.age();
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
## When get_ IS Appropriate
|
|
64
|
-
|
|
65
|
-
Use `get` when the method does more than simple access:
|
|
66
|
-
|
|
67
|
-
```rust
|
|
68
|
-
impl HashMap<K, V> {
|
|
69
|
-
// Returns Option - not just field access
|
|
70
|
-
fn get(&self, key: &K) -> Option<&V> { }
|
|
71
|
-
|
|
72
|
-
// Mutable variant
|
|
73
|
-
fn get_mut(&mut self, key: &K) -> Option<&mut V> { }
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
impl Vec<T> {
|
|
77
|
-
// Returns Option - bounds checked
|
|
78
|
-
fn get(&self, index: usize) -> Option<&T> { }
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
impl Context {
|
|
82
|
-
// Does computation/lookup, not just field access
|
|
83
|
-
fn get_config(&self) -> Config {
|
|
84
|
-
self.configs.get(&self.current_env).cloned().unwrap_or_default()
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
## Standard Library Examples
|
|
90
|
-
|
|
91
|
-
```rust
|
|
92
|
-
// No get_ prefix
|
|
93
|
-
String::len()
|
|
94
|
-
Vec::len()
|
|
95
|
-
Vec::capacity()
|
|
96
|
-
Vec::is_empty()
|
|
97
|
-
Path::file_name()
|
|
98
|
-
Option::is_some()
|
|
99
|
-
Result::is_ok()
|
|
100
|
-
|
|
101
|
-
// With get - returns Option or does lookup
|
|
102
|
-
Vec::get(index)
|
|
103
|
-
HashMap::get(key)
|
|
104
|
-
BTreeMap::get(key)
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
## Pattern: Getter/Setter Pairs
|
|
108
|
-
|
|
109
|
-
```rust
|
|
110
|
-
impl Config {
|
|
111
|
-
// Getter: no prefix
|
|
112
|
-
fn timeout(&self) -> Duration {
|
|
113
|
-
self.timeout
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
// Setter: use set_ prefix
|
|
117
|
-
fn set_timeout(&mut self, timeout: Duration) {
|
|
118
|
-
self.timeout = timeout;
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
## Pattern: Builder Methods
|
|
124
|
-
|
|
125
|
-
```rust
|
|
126
|
-
impl ConfigBuilder {
|
|
127
|
-
// Builder methods: no get_, no set_
|
|
128
|
-
fn timeout(mut self, timeout: Duration) -> Self {
|
|
129
|
-
self.timeout = timeout;
|
|
130
|
-
self
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
fn retries(mut self, retries: u32) -> Self {
|
|
134
|
-
self.retries = retries;
|
|
135
|
-
self
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
```
|
|
139
|
-
|
|
140
|
-
## Decision Guide
|
|
141
|
-
|
|
142
|
-
| Pattern | Naming |
|
|
143
|
-
|---------|--------|
|
|
144
|
-
| Simple field access | `name()`, `value()`, `len()` |
|
|
145
|
-
| Boolean property | `is_valid()`, `has_items()` |
|
|
146
|
-
| Fallible access | `get()`, `get_mut()` |
|
|
147
|
-
| Setter | `set_name()`, `set_value()` |
|
|
148
|
-
| Builder | `name()`, `value()` (consuming self) |
|
|
149
|
-
|
|
150
|
-
## See Also
|
|
151
|
-
|
|
152
|
-
- [name-is-has-bool](./name-is-has-bool.md) - Boolean naming
|
|
153
|
-
- [name-is-has-bool](./name-is-has-bool.md) - Boolean naming
|
|
154
|
-
- [api-builder-pattern](./api-builder-pattern.md) - Builder pattern
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
# name-to-expensive
|
|
2
|
-
|
|
3
|
-
> Use `to_` prefix for expensive conversions that allocate or compute
|
|
4
|
-
|
|
5
|
-
## Why It Matters
|
|
6
|
-
|
|
7
|
-
The `to_` prefix signals "this conversion has a cost"—typically allocation, cloning, or computation. Callers know to consider caching the result or avoiding repeated calls. This contrasts with `as_` (free reference conversion) and `into_` (ownership transfer).
|
|
8
|
-
|
|
9
|
-
## Bad
|
|
10
|
-
|
|
11
|
-
```rust
|
|
12
|
-
impl Name {
|
|
13
|
-
// Misleading: suggests expensive operation
|
|
14
|
-
fn as_uppercase(&self) -> String {
|
|
15
|
-
self.0.to_uppercase() // Allocates!
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
// Misleading: suggests cheap reference
|
|
19
|
-
fn get_string(&self) -> String {
|
|
20
|
-
self.0.clone() // Allocates!
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
## Good
|
|
26
|
-
|
|
27
|
-
```rust
|
|
28
|
-
impl Name {
|
|
29
|
-
// to_ = allocates/computes
|
|
30
|
-
fn to_uppercase(&self) -> String {
|
|
31
|
-
self.0.to_uppercase()
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
// to_ = creates new value
|
|
35
|
-
fn to_string(&self) -> String {
|
|
36
|
-
self.0.clone()
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
// as_ = free reference (cheap)
|
|
40
|
-
fn as_str(&self) -> &str {
|
|
41
|
-
&self.0
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
## Standard Library Examples
|
|
47
|
-
|
|
48
|
-
```rust
|
|
49
|
-
// to_ methods - all allocate or compute
|
|
50
|
-
let s: String = slice.to_vec(); // Allocates Vec
|
|
51
|
-
let s: String = "hello".to_string(); // Allocates String
|
|
52
|
-
let s: String = "HELLO".to_lowercase(); // Allocates new String
|
|
53
|
-
let s: String = path.to_string_lossy().into_owned(); // May allocate
|
|
54
|
-
|
|
55
|
-
// Contrast with as_ methods - all are free
|
|
56
|
-
let slice: &[u8] = s.as_bytes(); // Just reinterpret
|
|
57
|
-
let str_ref: &str = string.as_str(); // Just reference
|
|
58
|
-
let path: &Path = Path::new("foo"); // Just reference
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
## Conversion Method Prefixes
|
|
62
|
-
|
|
63
|
-
| Prefix | Cost | Ownership | Example |
|
|
64
|
-
|--------|------|-----------|---------|
|
|
65
|
-
| `as_` | Free (O(1)) | Borrows `&T` | `as_str()`, `as_bytes()` |
|
|
66
|
-
| `to_` | Allocates/Computes | Creates new | `to_string()`, `to_vec()` |
|
|
67
|
-
| `into_` | Usually free | Takes ownership | `into_inner()`, `into_vec()` |
|
|
68
|
-
|
|
69
|
-
## Custom Types
|
|
70
|
-
|
|
71
|
-
```rust
|
|
72
|
-
struct Email(String);
|
|
73
|
-
|
|
74
|
-
impl Email {
|
|
75
|
-
// Cheap: just returns reference
|
|
76
|
-
fn as_str(&self) -> &str {
|
|
77
|
-
&self.0
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// Expensive: allocates
|
|
81
|
-
fn to_lowercase(&self) -> Email {
|
|
82
|
-
Email(self.0.to_lowercase())
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
// Expensive: allocates
|
|
86
|
-
fn to_display_format(&self) -> String {
|
|
87
|
-
format!("<{}>", self.0)
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
// Ownership transfer: usually cheap
|
|
91
|
-
fn into_string(self) -> String {
|
|
92
|
-
self.0
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
## to_owned() Pattern
|
|
98
|
-
|
|
99
|
-
```rust
|
|
100
|
-
// to_owned() for getting owned version of borrowed data
|
|
101
|
-
let borrowed: &str = "hello";
|
|
102
|
-
let owned: String = borrowed.to_owned(); // Allocates
|
|
103
|
-
|
|
104
|
-
let borrowed: &[i32] = &[1, 2, 3];
|
|
105
|
-
let owned: Vec<i32> = borrowed.to_owned(); // Allocates
|
|
106
|
-
|
|
107
|
-
// ToOwned trait
|
|
108
|
-
trait ToOwned {
|
|
109
|
-
type Owned;
|
|
110
|
-
fn to_owned(&self) -> Self::Owned;
|
|
111
|
-
}
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
## See Also
|
|
115
|
-
|
|
116
|
-
- [name-as-free](./name-as-free.md) - Free reference conversions
|
|
117
|
-
- [name-into-ownership](./name-into-ownership.md) - Ownership transfer
|
|
118
|
-
- [own-cow-conditional](./own-cow-conditional.md) - Avoiding unnecessary allocations
|