Understanding rust Ownership

The slice type

slice type does not have ownership

let s = String::new("Hello world");
// will contain "Hello", right index 5 is exclusive
let hello = &s[0..5];
// same as above
let hello = &s[..5];
let world = &s[6..11];
// from index 6 to end of
let world = &s[6..];
 
let len = s.len();
// whole String
let slice = &s[0..len];
// same as above
let slice = &s[..];

String literals are slices

let s = "Hello, world";
// s is inferred to &str
// &str is an immutable reference

String slices as parameters

fn first_word(s: &String) -> &str {
// better the following as we can use the same function on both `&String` and `&str`:
fn first_word(s: &str) -> &str {
// by passing a string slice takes advantage of deref coercions
fn first_word(s: &str) -> &str {
    let bytes = s.as_bytes();
 
    for (i, &item) in bytes.iter().enumerate() {
        if item == b' ' {
            return &s[0..i];
        }
    }
 
    &s[..]
}
 
fn main() {
    let my_string = String::from("hello world");
 
    // `first_word` works on slices of `String`s, whether partial or whole
    let word = first_word(&my_string[0..6]);
    let word = first_word(&my_string[..]);
    // `first_word` also works on references to `String`s, which are equivalent
    // to whole slices of `String`s
    let word = first_word(&my_string);
 
    let my_string_literal = "hello world";
 
    // `first_word` works on slices of string literals, whether partial or whole
    let word = first_word(&my_string_literal[0..6]);
    let word = first_word(&my_string_literal[..]);
 
    // Because string literals *are* string slices already,
    // this works too, without the slice syntax!
    let word = first_word(my_string_literal);
}