Руст користи проверу позајмљивања да би применио своја правила власништва и осигурао да су програми безбедни за меморију. Правила власништва диктирају како Руст управља меморијом преко стека и гомиле.

Док пишете Руст програме, мораћете да користите променљиве без промене власништва повезане вредности. Руст пружа снажан механизам позајмљивања који подстиче флексибилност и поновну употребу кода.

Шта је позајмљивање у Русту?

Позајмљивање је приступ вредности променљиве без преузимање власништва над променљивом упућивањем на власника. Провера позајмљивања обезбеђује да је референца важећа и да се подаци не испуштају помоћу конструкције која се зове животни век.

Животни век је колико дуго постоји променљива. Животни век почиње стварањем променљиве и завршава се уништавањем променљиве. Можете да позајмите власништво над променљивом, а када је позајмљена референца ван опсега, власништво се враћа променљивој власника. Позајмљивање је помало слично показиваче које ћете наћи у језицима као што су Ц++ и Го

instagram viewer
. Али Руст компајлер користи проверу позајмљивања како би осигурао да су програми сигурни у меморију.

Пример позајмљивања у Русту

Можете да позајмите власништво над променљивом упућивањем на власника помоћу симбола амперсанда (&).

фнглавни() {
дозволити к = Низ::фром("здраво"); // к поседује "здраво"
дозволити и = &к; // и референце к, позајмљује "здраво"
принтлн!("{}", Икс);
принтлн!(„{}“, и)
}

Без позајмљивања путем референци, програм би успаничио. То би прекршило правило власништва да вредност може имати једног власника, а две променљиве не могу упућивати на исту меморијску локацију. Позајмљивање може бити веома корисно у функцијама. Ево примера позајмљивања у функцији, да задржите власништво док позивате друге функције које узимају локалне променљиве као аргументе.

фнпринт_евен(вектор: &Вец<и32>) {
за вредности ин вецтр {
ако вредности % 2 == 0 {
принтлн!(„{}“, вредности);
}
}
}

Тхе принт_евен функција референцира вектор 32-битних целих бројева као свој аргумент. Затим штампа линије вредности које су вишеструке од два у вектору користећи фор-петљу и принтлн! макро.

фнглавни() {
дозволити број_вектора = вец![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
принт_евен(&број_вектор); // власништво је позајмљено, а не премештено
принтлн!(„Главна функција задржава власништво над вектором бројева{:?}“, нумбер_вецтор)
}

Главна функција декларише променљиву нумбер_вецтор и додељује јој вектор од 32-битних целих бројева. Затим позива функцију принт_евен и прослеђује јој референцу на број_вектора променљива помоћу симбола амперсанда.

Главна функција задржава власништво над број_вектора променљиву може наставити да користи вредност на својој меморијској локацији.

Позајмљивање и мутирање референци

Функције такође могу да модификују позајмљене варијабле користећи променљиве референце на њих, пре него што врате власништво.

Међутим, за разлику од редовних променљивих које се могу подесити на променљиве помоћу кључне речи мут, морате да додате променљиве референце симболом амперсанда.

Пре него што направите променљиве референце, променљива коју желите да измените мора бити променљива.

фнремове_валуе(вектор: &мутВец<и32>) -> &Вец<и32> {
вецтр.ремове(4);
повратак вецтр
}

Тхе ремове_валуе функција узима референцу променљивог вектора од 32-битних целих бројева. Враћа вектор од 32-битних целих бројева након уклањања вредности вектора у четвртом индексу.

фнглавни() {
дозволитимут нумс = вец![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
ремове_валуе(&мут нумс); // променљива референца овде
принтлн!("{:?}", бројеви);
}

Функција мења нумс вектор позивањем ремове_валуе и прослеђивањем променљиве референце вектора као аргумента. Приликом штампања вектора, претходни четврти индекс вектора не постоји.

Обратите пажњу да је аргумент референца на променљиви вектор.

Важно је разумети власништво и задуживање

Мораћете да разумете власништво и позајмљивање да бисте написали ефикасан Руст код који се компајлира и покреће. Ако ваш код не прати правила власништва, провера задуживања ће га открити. Мораћете да учините меморију вашег програма безбедним да би Руст могао да га компајлира.

Провера задуживања је досадна када сте нови у Русту. Али, док пишете више Руст кода, навићи ћете се на њега и стећи искуство у писању Руст кода који је сигуран у меморију.