Концепция Ownership в Rust

В языке программирования Rust для управления данными в куче (heap) используется концепция Ownership ("принадлежность", "владение"). Это характерная особенность Rust, позволяющая гарантировать безопасность памяти.

Ownership характеризуется рядом аспектов:

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

Рассмотрим простой пример:

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

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

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

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

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

Меняем владельца в функции

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

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

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

Следовательно, при компиляции мы увидим ту же ошибку на строке:

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