Rust использует средство проверки заимствования, чтобы обеспечить соблюдение правил владения и гарантировать, что программы безопасны для памяти. Правила владения определяют, как Rust управляет памятью в стеке и куче.
Когда вы пишете программы на Rust, вам нужно будет использовать переменные, не меняя владельца соответствующего значения. Rust предоставляет надежный механизм заимствования для обеспечения гибкости и повторного использования кода.
Что такое заимствование в Rust?
Заимствование — это доступ к значению переменной без получение права собственности на переменную со ссылкой на владельца. Средство проверки заимствования гарантирует, что ссылка действительна, а данные не удаляются с помощью конструкции, называемой временем жизни.
Время жизни — это то, как долго существует переменная. Время жизни начинается с создания переменной и заканчивается ее уничтожением. Вы можете заимствовать право собственности на переменную, и когда заимствованная ссылка выходит за пределы области действия, право собственности возвращается к переменной-владельцу. Заимствование немного похоже на
указатели, которые вы найдете в таких языках, как C++ и Go. Но компилятор Rust использует проверку заимствования, чтобы гарантировать, что программы безопасны для памяти.Пример заимствования в Rust
Вы можете позаимствовать право собственности на переменную, сославшись на владельца с помощью символа амперсанда (&).
фнглавный() {
позволять х = Нить::из("привет"); // x владеет "привет"
позволять у = &х; // y ссылается на x, заимствует "hello"
распечатать!("{}", Икс);
распечатать!("{}", у)
}
Без заимствования по ссылке программа запаниковала бы. Это нарушило бы правило владения, согласно которому у значения может быть один владелец, а две переменные не могут указывать на одно и то же место в памяти. Заимствование может быть очень полезным в функциях. Вот пример заимствования в функции, чтобы сохранить право собственности при вызове других функций, которые принимают локальные переменные в качестве аргументов.
фнprint_even(вектор: &Век<i32>) {
за ценности в вектор {
если ценности % 2 == 0 {
распечатать!("{}", ценности);
}
}
}
print_even функция ссылается на вектор 32-битных целых чисел в качестве своего аргумента. Затем он печатает строки значений, кратных двум, в векторе, используя цикл for и команду println! макрос.
фнглавный() {
позволять число_вектор = век![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
print_even(&number_vector); // собственность заимствована, а не перемещена
распечатать!(«Главная функция сохраняет за собой право собственности на числовой вектор {:?}», number_vector)
}
Основная функция объявляет переменную number_vector и присваивает ей вектор 32-битных целых чисел. Затем он вызывает функцию print_even и передает ей ссылку на число_вектор переменная с помощью символа амперсанда.
Основная функция сохраняет право собственности на число_вектор переменная, он может продолжать использовать значение в своей ячейке памяти.
Заимствование и изменение ссылок
Функции также могут изменять заимствованные переменные, используя изменяемые ссылки на них, прежде чем вернуть право собственности.
Однако, в отличие от обычных переменных, которые могут быть изменены с помощью ключевого слова mut, перед изменяемыми ссылками необходимо ставить символ амперсанда.
Прежде чем создавать изменяемые ссылки, переменная, которую вы хотите изменить, должна быть изменяемой.
фнудалить_значение(вектор: &мутВек<i32>) -> &Век<i32> {
вектор.удалить(4);
возвращаться вектор
}
удалить_значение функция принимает ссылку на изменяемый вектор 32-битных целых чисел. Он возвращает вектор 32-битных целых чисел после удаления значения вектора в четвертом индексе.
фнглавный() {
позволятьмут числа = век![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
удалить_значение (&мут числа); // здесь изменяемая ссылка
распечатать!("{:?}", цифры);
}
Функция изменяет числа vector, вызвав remove_value и передав изменяемую ссылку на вектор в качестве аргумента. При печати вектора предшествующий четвертый индекс вектора не существует.
Обратите внимание, что аргумент является ссылкой на изменяемый вектор.
Важно понимать право собственности и заимствование
Вам нужно понимать владение и заимствование, чтобы писать эффективный, безопасный для памяти код Rust, который компилируется и запускается. Если ваш код не соответствует правилам владения, средство проверки заимствования обнаружит это. Вам нужно сделать вашу программу безопасной для памяти, чтобы Rust смог ее скомпилировать.
Проверка заимствования раздражает, когда вы новичок в Rust. Но по мере того, как вы будете писать больше кода на Rust, вы привыкнете к нему и приобретете опыт написания безопасного для памяти кода на Rust.