Нам приходилось перемещать s в функцию и потом обратно его принимать с длиной s используя кортеж. Но теперь мы можем это более оптимизированном виде записать, используя ссылочные переменные.
fn main() {
let s = String::from("hello world");
let len = get_len(&s);
}
fn get_len(s: &String) -> usize
{
s.len() }
Мы в качестве аргумента отправляем ссылку на объект и также в параметрах указываем что это ссылка типа String. И возвращаем только длину объекта, так как s не передавала владение в функцию, она всё еще действительна.
Вспомним как хранится в памяти s. В стеке хранится ссылка на значение в куче, длинна и объем, когда мы передаем в функцию &s то передается только ссылка на объект.
Рассмотрим еще пример.
fn main() {
let s = String::from("hello");
add(&s); }
fn add(s: &String) {
s.push_str(" world"); }
в этом примере мы пытаемся в функции изменить переданное значение, но компилятор выведет ошибку. Чтобы исправить эту ошибку нам надо передать