Skip to content

Instantly share code, notes, and snippets.

@max-itzpapalotl
Last active January 6, 2024 13:12
Show Gist options
  • Save max-itzpapalotl/f7f9fa9e32b24d51dbc37a1e33b0c00e to your computer and use it in GitHub Desktop.
Save max-itzpapalotl/f7f9fa9e32b24d51dbc37a1e33b0c00e to your computer and use it in GitHub Desktop.
4. Strings and String Slices

4. Strings and String Slices

  • String vs. &String vs. &str vs. str
  • String constants
  • Converting between strings and slices
  • Taking a slice of a string
  • Byte slices
  • Conversion to strings
  • Unsafe but fast
  • Function arguments: prefer &str over &String

String vs. &str and byte sizes

fn main() {
    let s : String = "abc".to_string();
    let t : &str = "xyz";
    println!("{} {} {} {}",
             s, std::mem::size_of::<String>(),
             t, std::mem::size_of::<&str>());
    println!("{}", std::mem::size_of::<&mut String>());
}

Converting between String and &str

fn main() {
    let s : String = "abc".to_string();
    let t = &s[1..2];
    println!("{} {} {} {}",
             s, std::mem::size_of::<String>(),
             t, std::mem::size_of::<&str>());
}

Byte slices

fn main() {
    let s : String = "abc".to_string();
    let t = &s[1..2];
    let b = std::str::from_utf8(b"pqr").unwrap();
    println!("{} {} {} {} {}",
             s, std::mem::size_of::<String>(),
             t, std::mem::size_of::<&str>(), b);
}

Unsafe

fn main() {
    let s : String = "abc".to_string();
    let t = &s[1..2];
    let b = unsafe {
        std::str::from_utf8_unchecked(b"pqr")
    };
    println!("{} {} {} {} {}",
             s, std::mem::size_of::<String>(),
             t, std::mem::size_of::<&str>(), b);
}

Function arguments

fn f(s : &str) {
    println!("In f: {}", s);
}

fn main() {
    let s : String = "abc".to_string();
    f(&s);
    let t = &s[1..2];
    f(t);
    println!("{} {} {} {}",
             s, std::mem::size_of::<String>(),
             t, std::mem::size_of::<&str>());
}

References:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment