0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>В языке программирования Rust для управления данными в куче (heap) используется концепция<strong>Ownership</strong>("принадлежность", "владение"). Это характерная особенность Rust, позволяющая гарантировать безопасность памяти.</p>
1
<p>В языке программирования Rust для управления данными в куче (heap) используется концепция<strong>Ownership</strong>("принадлежность", "владение"). Это характерная особенность Rust, позволяющая гарантировать безопасность памяти.</p>
2
<p><strong>Ownership</strong>характеризуется рядом аспектов:</p>
2
<p><strong>Ownership</strong>характеризуется рядом аспектов:</p>
3
<ol><li>Каждое значение в языке Rust имеет переменную, которая является "владельцем" (owner).</li>
3
<ol><li>Каждое значение в языке Rust имеет переменную, которая является "владельцем" (owner).</li>
4
<li>У любого значения в один момент времени существует лишь один владелец.</li>
4
<li>У любого значения в один момент времени существует лишь один владелец.</li>
5
<li>Если владелец выходит за пределы области, в которой он определен, значение из памяти удаляется, для чего Rust автоматически вызывает функцию drop(), необходимую для очистки памяти.</li>
5
<li>Если владелец выходит за пределы области, в которой он определен, значение из памяти удаляется, для чего Rust автоматически вызывает функцию drop(), необходимую для очистки памяти.</li>
6
</ol><p>Рассмотрим простой пример:</p>
6
</ol><p>Рассмотрим простой пример:</p>
7
<p>Сначала определим переменную<strong>s1</strong>. Эта переменная -- владелец строки "hello" (сама строка хранится в куче).</p>
7
<p>Сначала определим переменную<strong>s1</strong>. Эта переменная -- владелец строки "hello" (сама строка хранится в куче).</p>
8
<p>Теперь изменим владельца, присвоив переменной<strong>s2</strong>значение<strong>s1</strong>.</p>
8
<p>Теперь изменим владельца, присвоив переменной<strong>s2</strong>значение<strong>s1</strong>.</p>
9
<p>Прежде чем двигаться дальше, вспомним, что у значения может быть<strong>лишь один владелец</strong>. Именно поэтому переменная<strong>s1</strong>перестает быть владельцем. Следовательно, владение строкой "hello" переходит к переменной<strong>s2</strong>.</p>
9
<p>Прежде чем двигаться дальше, вспомним, что у значения может быть<strong>лишь один владелец</strong>. Именно поэтому переменная<strong>s1</strong>перестает быть владельцем. Следовательно, владение строкой "hello" переходит к переменной<strong>s2</strong>.</p>
10
<p>Но надо понимать, что в результате переменная<strong>s1</strong>становится неинициализированной, те есть использовать ее больше нельзя, иначе будет ошибка при компиляции кода.</p>
10
<p>Но надо понимать, что в результате переменная<strong>s1</strong>становится неинициализированной, те есть использовать ее больше нельзя, иначе будет ошибка при компиляции кода.</p>
11
<p>Но в принципе в дальнейшем никто ведь не мешает инициализировать переменную<strong>s1</strong>заново, присвоив ей какое-нибудь значение:</p>
11
<p>Но в принципе в дальнейшем никто ведь не мешает инициализировать переменную<strong>s1</strong>заново, присвоив ей какое-нибудь значение:</p>
12
<h2>Меняем владельца в функции</h2>
12
<h2>Меняем владельца в функции</h2>
13
<p>Но что делать, если надо изменить владельца в функции? На самом деле, передавать значение параметра в функцию можно так же, как и при присвоении значения переменной:</p>
13
<p>Но что делать, если надо изменить владельца в функции? На самом деле, передавать значение параметра в функцию можно так же, как и при присвоении значения переменной:</p>
14
<p>Тут значение переменной<strong>s1</strong>передается параметру<strong>message</strong>во время вызова функции display_message():</p>
14
<p>Тут значение переменной<strong>s1</strong>передается параметру<strong>message</strong>во время вызова функции display_message():</p>
15
<p>Таким образом, переменная<strong>s1</strong>снова теряет владение над строкой "hello", так как это владение переходит к параметру<strong>message</strong>.</p>
15
<p>Таким образом, переменная<strong>s1</strong>снова теряет владение над строкой "hello", так как это владение переходит к параметру<strong>message</strong>.</p>
16
<p>Следовательно, при компиляции мы увидим ту же ошибку на строке:</p>
16
<p>Следовательно, при компиляции мы увидим ту же ошибку на строке:</p>
17
<p><em>По материалам https://metanit.com/rust/tutorial/.</em></p>
17
<p><em>По материалам https://metanit.com/rust/tutorial/.</em></p>
18
18