HTML Diff
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