String
String is the standard heap-allocated growable UTF-8 string buffer:
fn main() { let mut s1 = String::new(); s1.push_str("Hello"); println!("s1: len = {}, capacity = {}", s1.len(), s1.capacity()); let mut s2 = String::with_capacity(s1.len() + 1); s2.push_str(&s1); s2.push('!'); println!("s2: len = {}, capacity = {}", s2.len(), s2.capacity()); let s3 = String::from("🇨🇭"); println!("s3: len = {}, number of chars = {}", s3.len(), s3.chars().count()); }
String implements Deref<Target = str>, which means that you can call
all str methods on a String.
This slide should take about 10 minutes. 
                    - String::newreturns a new empty string, use- String::with_capacitywhen you know how much data you want to push to the string.
- String::lenreturns the size of the- Stringin bytes (which can be different from its length in characters).
- String::charsreturns an iterator over the actual characters. Note that a- charcan be different from what a human will consider a “character” due to grapheme clusters.
- When people refer to strings they could either be talking about &strorString.
- When a type implements Deref<Target = T>, the compiler will let you transparently call methods fromT.- We haven’t discussed the Dereftrait yet, so at this point this mostly explains the structure of the sidebar in the documentation.
- Stringimplements- Deref<Target = str>which transparently gives it access to- str’s methods.
- Write and compare let s3 = s1.deref();andlet s3 = &*s1;.
 
- We haven’t discussed the 
- Stringis implemented as a wrapper around a vector of bytes, many of the operations you see supported on vectors are also supported on- String, but with some extra guarantees.
- Compare the different ways to index a String:- To a character by using s3.chars().nth(i).unwrap()whereiis in-bound, out-of-bounds.
- To a substring by using s3[0..4], where that slice is on character boundaries or not.
 
- To a character by using 
- Many types can be converted to a string with the
to_stringmethod. This trait is automatically implemented for all types that implementDisplay, so anything that can be formatted can also be converted to a string.