Skip to content

Commit e3ed513

Browse files
authored
Improve strategy pattern example (#241)
Reduce unnecessary String creation
1 parent 96fa89b commit e3ed513

File tree

1 file changed

+17
-18
lines changed

1 file changed

+17
-18
lines changed

patterns/strategy.md

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,17 @@ have to implement the `Formatter` trait.
3333

3434
```rust
3535
use std::collections::HashMap;
36+
3637
type Data = HashMap<String, u32>;
3738

3839
trait Formatter {
39-
fn format(&self, data: &Data, s: &mut String);
40+
fn format(&self, data: &Data, buf: &mut String);
4041
}
4142

4243
struct Report;
4344

4445
impl Report {
46+
// Write should be used but we kept it as String to ignore error handling
4547
fn generate<T: Formatter>(g: T, s: &mut String) {
4648
// backend operations...
4749
let mut data = HashMap::new();
@@ -54,29 +56,25 @@ impl Report {
5456

5557
struct Text;
5658
impl Formatter for Text {
57-
fn format(&self, data: &Data, s: &mut String) {
58-
*s = data
59-
.iter()
60-
.map(|(key, val)| format!("{} {}\n", key, val))
61-
.collect();
59+
fn format(&self, data: &Data, buf: &mut String) {
60+
for (k, v) in data {
61+
let entry = format!("{} {}\n", k, v);
62+
buf.push_str(&entry);
63+
}
6264
}
6365
}
6466

6567
struct Json;
6668
impl Formatter for Json {
67-
fn format(&self, data: &Data, s: &mut String) {
68-
*s = String::from("[");
69-
let mut iter = data.into_iter();
70-
if let Some((key, val)) = iter.next() {
71-
let entry = format!(r#"{{"{}":"{}"}}"#, key, val);
72-
s.push_str(&entry);
73-
while let Some((key, val)) = iter.next() {
74-
s.push(',');
75-
let entry = format!(r#"{{"{}":"{}"}}"#, key, val);
76-
s.push_str(&entry);
77-
}
69+
fn format(&self, data: &Data, buf: &mut String) {
70+
buf.push('[');
71+
for (k, v) in data.into_iter() {
72+
let entry = format!(r#"{{"{}":"{}"}}"#, k, v);
73+
buf.push_str(&entry);
74+
buf.push(',');
7875
}
79-
s.push(']');
76+
buf.pop(); // remove extra , at the end
77+
buf.push(']');
8078
}
8179
}
8280

@@ -86,6 +84,7 @@ fn main() {
8684
assert!(s.contains("one 1"));
8785
assert!(s.contains("two 2"));
8886

87+
s.clear(); // reuse the same buffer
8988
Report::generate(Json, &mut s);
9089
assert!(s.contains(r#"{"one":"1"}"#));
9190
assert!(s.contains(r#"{"two":"2"}"#));

0 commit comments

Comments
 (0)