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?