fn greet(name: &str) -> String { // take &str, return String
format!("Hello, {name}!") // format! always returns String
}
fn main() {
// String literals are &'static str
let lit: &str = "hello";
// Build a String (heap-allocated, mutable)
let mut owned: String = String::from("hi");
owned.push_str(", world");
// &str ↔ String
let from_string: &str = &owned; // String → &str
let to_string: String = "abc".to_string(); // &str → String
let also_to: String = String::from("abc"); // same thing
// Slice into a UTF-8 boundary — bytes, not chars!
let s = "héllo";
println!("{}", &s[0..3]); // "hé" (h + é which is 2 bytes)
// &s[0..2] would panic — not a char boundary
println!("{} {} {} {}", lit, owned, from_string, to_string);
println!("{}", greet("Alice"));
}
Create a free account and build your private vault. Share publicly whenever you want.