Концепция Ownership в Rust
В языке программирования Rust для управления данными в куче (heap) используется концепция Ownership ("принадлежность", "владение"). Это характерная особенность Rust, позволяющая гарантировать безопасность памяти.
Ownership характеризуется рядом аспектов:
- Каждое значение в языке Rust имеет переменную, которая является "владельцем" (owner).
 - У любого значения в один момент времени существует лишь один владелец.
 - Если владелец выходит за пределы области, в которой он определен, значение из памяти удаляется, для чего Rust автоматически вызывает функцию 
drop() , необходимую для очистки памяти. 
Рассмотрим простой пример:

Сначала определим переменную s1. Эта переменная -- владелец строки "hello" (сама строка хранится в куче).

Теперь изменим владельца, присвоив переменной s2 значение s1.

Прежде чем двигаться дальше, вспомним, что у значения может быть лишь один владелец. Именно поэтому переменная s1 перестает быть владельцем. Следовательно, владение строкой "hello" переходит к переменной s2.

Но надо понимать, что в результате переменная s1 становится неинициализированной, те есть использовать ее больше нельзя, иначе будет ошибка при компиляции кода.


Но в принципе в дальнейшем никто ведь не мешает инициализировать переменную s1 заново, присвоив ей какое-нибудь значение:

Меняем владельца в функции
Но что делать, если надо изменить владельца в функции? На самом деле, передавать значение параметра в функцию можно так же, как и при присвоении значения переменной:

Тут значение переменной s1 передается параметру message во время вызова функции 

Таким образом, переменная s1 снова теряет владение над строкой "hello", так как это владение переходит к параметру message.
Следовательно, при компиляции мы увидим ту же ошибку на строке:

По материалам https://metanit.com/rust/tutorial/.