Strings
String
- roughly speaking, a wrapper of
Vec<u8>
Sized
str
- string slice
- not
Sized
- DST; dynamically sized type
- can't allocate to stack
let mut s = String::with_capacity(5);
s.push_str("Hello");
let t: str = s[1..];
// error[E0277]: the size for values of type `str` cannot be known at compilation time
// |
// 8 | let t: str = s[1..];
// | ^ doesn't have a size known at compile-time
// |
// = help: the trait `Sized` is not implemented for `str`
// = note: all local variables must have a statically known size
// = help: unsized locals are gated as an unstable feature
// help: consider borrowing here
// |
// 8 | let t: &str = s[1..];
// | +
&str
- fat reference
- reference storing metadata; a pointer and length of the
str
- reference storing metadata; a pointer and length of the
Sized
Example
let mut s = String::with_capacity(5);
s.push_str("Hello");
let t: &str = &s[1..];
┌──────────────────────────────────────────┐
│ │
│ s: String │ t: &str
┌──────▼──────┬────────────┬────────────┐ ┌─────┼─────┐ ┌───────────┬───────────┐
Stack │ pointer │ length │ capacity │ │ pointer │ │ pointer │ length │
│ │ │ 5 │ 5 │ │ │ │ │ │ 4 │
└──────┼──────┴────────────┴────────────┘ └───────────┘ └─────┼─────┴───────────┘
│ &s: &String │
│ │
│ str │
│ ┌───────────────┐ │
│ │
┌─▼─┬───┬───┬───┬───┐ │
Heap │ H │ e │ l │ l │ o │ │
└───┴─▲─┴───┴───┴───┘ │
│ │
│ │
└──────────────────────────────────────────────── ──────┘