Продолжаю разбираться с владением в
Rust и дошел до статьи про ссылки и заимствование.
Чтобы не передавать владение каждый раз, можно использовать ссылки. Ссылки объявляются в
Rust с помощью символа
&, что по синтаксису схоже с передачей
inout параметров функций в
Swift. Но в отличие от
Swift, в
Rust данные по ссылке изменять нельзя, если не добавить ключевое слово
mut. В итоге, чтобы данные по ссылке можно было изменять, ссылка объявляется как
&mut
Пример:
let name = String::from("Artem");
let ref_to_name = &name; // Заимствуем
println!("{}", name); // Ok: Artem
println!("{}", ref_to_name); // Ok: Artem
...
let mut age = 30;
println!("{}", age); // Ok: 30
let mutable_ref = &mut age;
mutable_ref = 33;
println!("{}", age); // Ok: 33
Но есть важное правило: в одной области видимости может существовать только одна изменяемая ссылка на одни и те же данные и никаких других ссылок (даже тех, которые не позволяют изменять данные).
Интересное решение, благодаря которому не возникнет гонки данных, ведь проверка идет во время компиляции программы, хоть к такой работе с ссылками и придется долго привыкать.