Skip to main content

Command Palette

Search for a command to run...

đŸĻ€ Rust Ownership āĻāĻŦāĻ‚ Borrowing

Published
â€ĸ4 min read
M

A self-motivated and enthusiastic web developer with a deep interest in JavaScript (React.js). To work in the Software industry with modern web technologies of different local & multinational Software/ IT agencies of Bangladesh and grow rapidly with increasing responsibilities.

Rust āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāĻŋāĻ‚ āĻ˛ā§āϝāĻžāĻ™ā§āĻ—ā§ā§Ÿā§‡āϜāϕ⧇ āĻŦāϞāĻž āĻšā§Ÿ memory-safe, fast, āĻāĻŦāĻ‚ modernāĨ¤ āĻāϰ āϏāĻŦāĻšā§‡ā§Ÿā§‡ āĻŦā§œā§‹ āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝ āĻšāϞ⧋ Ownership SystemāĨ¤ Rust-āĻ garbage collector āύ⧇āχ, āφāĻŦāĻžāϰ manual memory free āĻ•āϰāĻžāϰāĻ“ āĻĻāϰāĻ•āĻžāϰ āύ⧇āχāĨ¤
👉 āĻŦāϰāĻ‚ Rust Ownership āĻāĻŦāĻ‚ Borrowing Rules āĻĻāĻŋā§Ÿā§‡ compile-time-āĻ āĻŽā§‡āĻŽā§‹āϰāĻŋ āϏ⧇āĻĢāϟāĻŋ āύāĻŋāĻļā§āϚāĻŋāϤ āĻ•āϰ⧇āĨ¤

āφāϜāϕ⧇ āφāĻŽāϰāĻž āĻļāĻŋāĻ–āĻŦā§‹ —

  1. Ownership āĻ•āĻŋ?

  2. Borrowing āĻ•āĻŋ?

  3. āĻāχ āϏāĻŋāĻ¸ā§āĻŸā§‡āĻŽ āϕ⧇āύ āĻĻāϰāĻ•āĻžāϰ?

  4. Memory Level-āĻ āĻ•āĻŋāĻ­āĻžāĻŦ⧇ āĻ•āĻžāϜ āĻ•āϰ⧇?

  5. Real-world problem āĻ•āĻŋāĻ­āĻžāĻŦ⧇ solve āĻšā§Ÿ?


ā§§. Ownership āϕ⧀?

Rust-āĻ āĻĒā§āϰāϤāĻŋāϟāĻŋ value-āĻāϰ āĻāĻ•āϟāĻŋ Owner āĻĨāĻžāϕ⧇āĨ¤ Owner āĻŦāϞāϤ⧇ āĻŦā§‹āĻā§‹, āϝ⧇ variable āϏ⧇āχ value-āϰ āĻŽāĻžāϞāĻŋāĻ•āĨ¤
āφāϰ Ownership rules āĻšāϞ⧋:

  1. āĻĒā§āϰāϤāĻŋāϟāĻŋ value-āĻāϰ āĻāĻ•āϜāύ owner āĻĨāĻžāĻ•āĻŦ⧇

  2. āĻāĻ• āϏāĻŽā§Ÿā§‡ āĻāĻ•āϜāύ owner-āχ āĻĨāĻžāĻ•āϤ⧇ āĻĒāĻžāϰāĻŦ⧇

  3. Owner scope-āĻāϰ āĻŦāĻžāχāϰ⧇ āϗ⧇āϞ⧇ value āĻŽā§‡āĻŽā§‹āϰāĻŋ āĻĨ⧇āϕ⧇ āĻĢā§āϰāĻŋ āĻšā§Ÿā§‡ āϝāĻžāĻŦ⧇ (Drop āĻšā§Ÿā§‡ āϝāĻžāĻŦ⧇)

fn main() {
    let s = String::from("Hello, Rust!");
    println!("{}", s);
}
  • āĻāĻ–āĻžāύ⧇ s āĻšāϞ⧋ ownerāĨ¤

  • āϝāĻ–āύ main() āĻļ⧇āώ āĻšāĻŦ⧇, s scope-āĻāϰ āĻŦāĻžāχāϰ⧇ āϚāϞ⧇ āϝāĻžāĻŦ⧇ → memory free āĻšāĻŦ⧇āĨ¤

👉 āĻ…āĻ°ā§āĻĨāĻžā§Ž, Rust āύāĻŋāĻœā§‡ āĻĨ⧇āϕ⧇ garbage collect āĻ•āϰ⧇ āύāĻž, āĻ•āĻŋāĻ¨ā§āϤ⧁ s scope āĻĨ⧇āϕ⧇ āĻŦ⧇āϰ āĻšāϞ⧇ RAII (Resource Acquisition Is Initialization) āĻŽāĻĄā§‡āϞ⧇āϰ āĻŽāϤ⧋ value free āĻ•āϰ⧇ āĻĻā§‡ā§ŸāĨ¤


⧍. Move (Ownership Transfer)

āϝāĻ–āύ āĻāĻ•āϟāĻž value āύāϤ⧁āύ variable-āĻ assign āĻ•āϰāĻž āĻšā§Ÿ, āϤāĻ–āύ ownership transfer āĻšā§ŸāĨ¤

fn main() {
    let s1 = String::from("Munna");
    let s2 = s1;  // Ownership move āĻšā§Ÿā§‡ āϗ⧇āϞ
    println!("{}", s2);  
    // println!("{}", s1);  ❌ Error: s1 āφāϰ owner āύ⧟
}
  • āĻāĻ–āĻžāύ⧇ s1 āĻĨ⧇āϕ⧇ s2 ownership āϚāϞ⧇ āϗ⧇āϛ⧇āĨ¤

  • āĻāĻ–āύ āĻļ⧁āϧ⧁ s2 ownerāĨ¤

  • s1 use āĻ•āϰāϞ⧇ compiler error āĻĻ⧇āĻŦ⧇āĨ¤

👉 āϕ⧇āύ? āĻ•āĻžāϰāĻŖ āϝāĻĻāĻŋ s1 āφāϰ s2 āĻĻ⧁āϜāύ āĻāĻ•āϏāĻžāĻĨ⧇ owner āĻšā§Ÿā§‡ āϝ⧇āϤ⧋, āϤāĻžāĻšāϞ⧇ double free error āĻšāϤ⧇ āĻĒāĻžāϰāϤ⧋āĨ¤ Rust āĻāϟāĻžāϕ⧇ āĻļ⧁āϰ⧁āϤ⧇āχ āφāϟāĻ•āĻžā§ŸāĨ¤


ā§Š. Borrowing (āϧāĻžāϰ āĻĻ⧇āĻ“ā§ŸāĻž)

āϏāĻŦāϏāĻŽā§Ÿ ownership move āĻ•āϰāϞ⧇ āϏāĻŽāĻ¸ā§āϝāĻž āĻšāϤ⧋āĨ¤ āĻāϜāĻ¨ā§āϝ Rust Borrowing system āĻāύ⧇āϛ⧇āĨ¤
👉 Borrowing āĻŽāĻžāύ⧇ āĻšāϞ⧋ owner āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āύāĻž āĻ•āϰ⧇ value āϕ⧇ āϧāĻžāϰ āĻĻ⧇āĻ“ā§ŸāĻžāĨ¤

Immutable Borrowing

fn main() {
    let s = String::from("Rust");
    let len = calculate_length(&s);  // &s āĻŽāĻžāύ⧇ borrow āĻ•āϰāϞāĻžāĻŽ
    println!("Length of {} is {}", s, len);
}

fn calculate_length(s: &String) -> usize {
    s.len()
}
  • &s āĻŽāĻžāύ⧇ s āϕ⧇ borrow āĻ•āϰāĻž āĻšāϞ⧋āĨ¤

  • Ownership s-āĻāϰ āĻ•āĻžāϛ⧇āχ āĻĨāĻžāĻ•āĻŦ⧇āĨ¤

  • calculate_length āĻļ⧁āϧ⧁ āĻĒ⧜āϤ⧇ āĻĒāĻžāϰāĻŦ⧇, modify āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŦ⧇ āύāĻžāĨ¤

👉 Rule: āĻāĻ•āϏāĻžāĻĨ⧇ āϝāϤ āϖ⧁āĻļāĻŋ immutable borrow āĻ•āϰāĻž āϝāĻžāĻŦ⧇āĨ¤


Mutable Borrowing

fn main() {
    let mut s = String::from("Hello");
    change(&mut s);   // mutable borrow
    println!("{}", s);
}

fn change(s: &mut String) {
    s.push_str(", World!");
}
  • āĻāĻ–āĻžāύ⧇ &mut s āĻĻāĻŋā§Ÿā§‡ mutable borrow āĻ•āϰāĻž āĻšā§Ÿā§‡āϛ⧇āĨ¤

  • āĻāĻ–āύ function value modify āĻ•āϰāϤ⧇ āĻĒāĻžāϰāĻŦ⧇āĨ¤

👉 Rule: āĻāĻ• āϏāĻŽā§Ÿā§‡ āĻļ⧁āϧ⧁ āĻāĻ•āϟāĻžāχ mutable borrow āĻ•āϰāĻž āϝāĻžāĻŦ⧇āĨ¤


ā§Ē. āϕ⧇āύ āĻāχ Ownership & Borrowing āĻĻāϰāĻ•āĻžāϰ?

Rust-āĻāϰ āĻāχ āύāĻŋ⧟āĻŽāϗ⧁āϞ⧋ main āϤāĻŋāύāϟāĻž āϏāĻŽāĻ¸ā§āϝāĻžāϰ āϏāĻŽāĻžāϧāĻžāύ āĻ•āϰ⧇:

  1. Dangling Pointer – invalid memory reference

  2. Double Free – āĻāĻ•āχ memory āĻĻ⧁āχāĻŦāĻžāϰ free āĻšā§Ÿā§‡ crash

  3. Data Race – āĻāĻ•āĻžāϧāĻŋāĻ• thread āĻāĻ•āϏāĻžāĻĨ⧇ unsafe āĻ­āĻžāĻŦ⧇ memory access


ā§Ģ. Memory Level-āĻ āĻ•āĻŋ āϘāĻŸā§‡?

āϧāϰ⧋, āφāĻŽāϰāĻž āĻāĻ•āϟāĻž String āĻŦāĻžāύāĻžāϞāĻžāĻŽ:

let s = String::from("Rust");

Memory Layout

  • s variable stack-āĻ pointer āϰāĻžāϖ⧇āĨ¤

  • String-āĻāϰ āφāϏāϞ data heap-āĻ āĻĨāĻžāϕ⧇āĨ¤

  • Pointer + length + capacity stack-āĻ store āĻšā§ŸāĨ¤

Stack:  [ ptr → heap, len = 4, capacity = 4 ]
Heap:   [ 'R', 'u', 's', 't' ]

👉 āĻāĻ–āύ āϝāĻĻāĻŋ ownership move āĻšā§Ÿ:

let s1 = String::from("Hello");
let s2 = s1;
  • s2-āϤ⧇ pointer copy āĻšā§Ÿ, āĻ•āĻŋāĻ¨ā§āϤ⧁ ownership shift āĻšā§Ÿā§‡ āϝāĻžā§ŸāĨ¤

  • s1 āφāϰ valid āύ⧟āĨ¤

👉 Borrowing āĻšāϞ⧇:

  • Owner āĻĒāϰāĻŋāĻŦāĻ°ā§āϤāύ āĻšā§Ÿ āύāĻžāĨ¤

  • āĻļ⧁āϧ⧁ reference (&) stack pointer āĻšāĻŋāϏāĻžāĻŦ⧇ āϝāĻžā§ŸāĨ¤

  • Reference āĻĻāĻŋā§Ÿā§‡ data access āĻ•āϰāĻž āϝāĻžā§Ÿ, āĻ•āĻŋāĻ¨ā§āϤ⧁ āφāϏāϞ owner control āϧāϰ⧇ āϰāĻžāϖ⧇āĨ¤


ā§Ŧ. Real World Problem Solve

āϧāϰ⧋ āϤ⧁āĻŽāĻŋ āĻāĻ•āϟāĻŋ multi-threaded program āĻŦāĻžāύāĻžāĻšā§āϛ⧋ āϝ⧇āĻ–āĻžāύ⧇ āĻāĻ•āĻžāϧāĻŋāĻ• thread āĻāĻ•āχ data āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰāĻŦ⧇āĨ¤
C/C++-āĻ āĻšāϞ⧇ manual lock āĻĻāĻŋāϤ⧇ āĻšāϤ⧋āĨ¤ āϭ⧁āϞ āĻ•āϰāϞ⧇ memory corruption āĻšāϤ⧋āĨ¤

Rust-āĻ:

  • Immutable borrow → āĻāĻ•āϏāĻžāĻĨ⧇ āĻ…āύ⧇āĻ• thread data read āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇

  • Mutable borrow → āĻāĻ• āϏāĻŽā§Ÿā§‡ āĻļ⧁āϧ⧁ āĻāĻ•āϟāĻŋ thread data write āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇

āĻĢāϞāĻžāĻĢāϞ: Data Race impossible at compile time!


ā§­. Beginner-Friendly Summary

  1. Ownership – āĻĒā§āϰāϤāĻŋāϟāĻŋ value-āĻāϰ āĻāĻ•āϜāύ āĻŽāĻžāϞāĻŋāĻ• (owner) āĻĨāĻžāϕ⧇

  2. Move – owner āĻ…āĻ¨ā§āϝ variable-āĻ āϚāϞ⧇ āϝāĻžā§Ÿ

  3. Borrowing – owner āĻŦāĻĻāϞāĻžā§Ÿ āύāĻž, āĻļ⧁āϧ⧁ reference āϝāĻžā§Ÿ

    • Immutable Borrow → āĻāĻ•āϏāĻžāĻĨ⧇ āĻ…āύ⧇āĻ•āĻŦāĻžāϰ

    • Mutable Borrow → āĻāĻ• āϏāĻŽā§Ÿā§‡ āĻāĻ•āĻŦāĻžāϰ

  4. Scope āĻļ⧇āώ āĻšāϞ⧇ owner-āĻāϰ value āĻŽā§‡āĻŽā§‹āϰāĻŋ āĻĨ⧇āϕ⧇ free āĻšā§Ÿā§‡ āϝāĻžā§Ÿ

  5. Rust compiler compile-time-āĻāχ āĻāχ āϏāĻŦ check āĻ•āϰ⧇ → runtime-āĻ memory bug āύ⧇āχ

M

Nice Explain

More from this blog

DSA āĻŽāĻžāύ⧇ āĻļ⧁āϧ⧁ LeetCode āύāĻž — DSA āĻŽāĻžāύ⧇ Production System slow āύāĻž āĻ•āϰāĻž

āĻ…āύ⧇āϕ⧇āχ āĻŦāϞ⧇ — “āĻ­āĻžāχ, Web Development-āĻ DSA āϞāĻžāϗ⧇ āύāĻžâ€ āφāϏāϞ⧇ Junior Developer āĻĨāĻžāĻ•āϞ⧇ āĻāĻŽāύāϟāĻžāχ āĻŽāύ⧇ āĻšāϝāĻŧāĨ¤āφāĻŽāĻŋ āύāĻŋāĻœā§‡āĻ“ Junior āĻĨāĻžāĻ•āϤ⧇ āϤāĻžāχ āĻ­āĻžāĻŦāϤāĻžāĻŽāĨ¤ āφāĻŽāĻžāϰ āφāĻŦāĻžāϰ āĻāĻ•āϟāĻž āĻŦāĻžāĻœā§‡ āĻ¸ā§āĻŦāĻ­āĻžāĻŦ āφāϛ⧇ 😅👉 āϕ⧋āύ āĻ•āĻŋāϛ⧁āϰ āĻŦāĻžāĻ¸ā§āϤāĻŦ āĻĒā§āϰāϝāĻŧā§‹āϜāύ āύāĻž āĻŦ⧁āĻāϞ⧇ āϏ⧇āϟāĻž āφāĻŽāĻžāϰ āĻŽāĻžāĻĨāĻžāϝāĻŧ āĻĸ⧁āϕ⧇ āύāĻžāĨ¤ Junior āĻĨāĻžāĻ•āϤ⧇ DSA āĻļāĻŋāϖ⧇āĻ›āĻŋ...

Dec 24, 20253 min read
DSA āĻŽāĻžāύ⧇ āĻļ⧁āϧ⧁ LeetCode āύāĻž — DSA āĻŽāĻžāύ⧇ Production System slow āύāĻž āĻ•āϰāĻž

đŸĻ€ Rust-āĻ āĻŽā§‡āĻŽāϰāĻŋ āĻŽā§āϝāĻžāύ⧇āϜāĻŽā§‡āĻ¨ā§āϟ: GC āĻ›āĻžā§œāĻž In-depth.

Rust-āĻ Garbage Collector (GC) āύ⧇āχ, āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻŽā§‡āĻŽāϰāĻŋ āύāĻŋāϰāĻžāĻĒāĻ¤ā§āϤāĻž (memory safety) āφāϰ performance Rust-āĻāϰ āϏāĻŦāĻšā§‡ā§Ÿā§‡ āĻļāĻ•ā§āϤāĻŋāĻļāĻžāϞ⧀ āĻĻāĻŋāĻ•āĨ¤āϤāĻžāχ, Go-āĻāϰ āĻŽāϤ⧋ runtime-based GC āύāĻž āĻĨāĻžāĻ•āĻž āϏāĻ¤ā§āĻ¤ā§āĻŦ⧇āĻ“ Rust compile-time āĻ āĻŽā§‡āĻŽāϰāĻŋ āĻŽā§āϝāĻžāύ⧇āϜ āĻ•āϰ⧇ Ownership System, Borrow Checker, āφāϰ Lifetime...

Oct 5, 202523 min read
đŸĻ€ Rust-āĻ āĻŽā§‡āĻŽāϰāĻŋ āĻŽā§āϝāĻžāύ⧇āϜāĻŽā§‡āĻ¨ā§āϟ: GC āĻ›āĻžā§œāĻž In-depth.

Morshedul Munna

45 posts

As a Software Developer, I am like an architect who designs and builds digital Products. I use my knowledge and expertise to create modern applications that are both efficient and elegant.