Slices TODO


TODO: I often get wires crossed. Mutability and References are not dependent on each other. Specifically, the idea of an immutable reference throws me. Potentially write something up about that.


from: https://doc.rust-lang.org/book/ch04-03-slices.html

It's labeled as The Slice Type

Baisc example:

fn main() {

  let alfa = String::from("the quick fox");

  let bravo = &alfa[4..9];

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

}

If you're starting at zero, you don't need to put the zero. These are equivalent.

fn main() {

  let alfa = String::from("the quick fox");

  let bravo   = &alfa[0..3];

  let charlie = &alfa[..3];

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

}

The same applies for the end.

fn main() {

  let alfa = String::from("the quick fox");

  let bravo   = &alfa[9..13];

  let charlie = &alfa[9..];

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

}

There's also a note about array slices here: https://doc.rust-lang.org/book/ch04-03-slices.html

It looks like this:

fn main() {

  let alfa = [3, 5, 7, 9];

  let bravo = &alfa[1..3];

  assert_eq!(bravo, &[5, 7]);

}

but maybe wait until vecs.

Also, we haven't seen assertions yet, and I don't totally get the refernce to the stand alone array. or, more to the point, why it's a reference.

This is from the "Other Slices" secition. Need to revisit once there's a better understanding of the parts.

Also, we haven't seen assertions yet, and I don't totally get the refernce to the stand alone array. or, more to the point, why it's a reference.

This is from the "Other Slices" secition. Need to revisit once there's a better understanding of the parts.


Look at: https://doc.rust-lang.org/book/ch04-03-slices.html

For the stuff about literals too and how you can pass them into functions wiht

#![allow(unused)]
fn main() {
fn widget(value: &str) -> &str {}
}

That lets you pass in both &String and &str values.

This is an example where you can pass literal references, and String references, and String slices (which are references by definition)

fn main() {

  let alfa = String::from("the quick fox");
  let bravo = "the lazy dog";

  widget(&alfa);
  widget(&alfa[4..9]);

  widget(&bravo);
  widget(&bravo[4..8]);

}

fn widget(value: &str) {

  println!("Value is {}", value);

}

Question: does this mean that you should pretty much always use &str instead of &String for function parameters?