Strings

Create a string with text you already know:

let alfa = String::from("apple");

Create an empty string. Probably want to make it mutable so you can add stuff to it.

let mut alfa = String::new();

Add text

alfa.push_str("pie");

Adding a single character with .push()

alfa.push("s");

Concationation -

Use format!() which is like println!() but it makes a new string instead of printing to output.

#![allow(unused)]
fn main() {
let alfa = String::from("apple");
let bravo = String::from("berry");

let charlie = format!("{}{}", alfa, bravo);

println!("{alfa} {bravo} {charlie}");
}

at some point put in the details about using + and how ownership works. This is for a later chapter. For now just stick with format!(). Note that ownership of alfa gets moved to charlie so it can't be used in the println!()

#![allow(unused)]
fn main() {
let alfa = String::from("apple");
let bravo = String::from("berry");

let charlie = alfa + &bravo;

println!("{bravo} {charlie}");
}

Iterating over a string with .chars()

#![allow(unused)]
fn main() {
let alfa = String::from("apple");

for character in alfa.chars() {
  println!("character is {character}");
}

println!("alfa is {alfa}");
}

TODO: Go over why &alfa[0..4] is tricky because with UTF-8 that's 2 characters in Russian.


Strings are always valid UTF-8


.replace

makes a new string, but it doesn't take ownership so alfa is still available

#![allow(unused)]
fn main() {
let alfa = String::from("the quick fox");
let bravo = alfa.replace("quick", "slow");

println!("alfa is {alfa}");
println!("bravo is {bravo}");
}

.contains()

TODO: Figures out when to show as_str() stuff.

#![allow(unused)]
fn main() {
let alfa = String::from("the quick fox");
let bravo = String::from("quick");

if alfa.contains(bravo.as_str()) {
  println!("found {bravo}");
} else {
  println!("did not find {bravo}");
}
}