Debug School

rakesh kumar
rakesh kumar

Posted on

Programming on compound data type in rust

Different type of Compound data type
Programming on tuples
Programming on array and slice

Different type of Compound data type

Rust mainly provides four core compound data types:

Tuples

Arrays

Slices

Structs (including tuple structs & unit structs)
Enter fullscreen mode Exit fullscreen mode

Additionally, Enums are often discussed alongside compound types because they group data variants.

1️⃣ Tuple

A tuple groups values of different types.

Example

fn main() {
    let person = ("Ashwani", 27, true);

    println!("Name: {}", person.0);
    println!("Age: {}", person.1);
    println!("Active: {}", person.2);
}
Enter fullscreen mode Exit fullscreen mode

Output

Name: Ashwani
Age: 27
Active: true
Enter fullscreen mode Exit fullscreen mode

Key Points

Fixed size

Can mix different types

Indexed using .0, .1, etc.
Enter fullscreen mode Exit fullscreen mode

2️⃣ Array

An array stores multiple values of the same type with fixed length.

Example

fn main() {
    let numbers: [i32; 4] = [10, 20, 30, 40];

    println!("First: {}", numbers[0]);
    println!("Length: {}", numbers.len());
}
Enter fullscreen mode Exit fullscreen mode

Output

First: 10
Length: 4
Enter fullscreen mode Exit fullscreen mode

Key Points

Fixed size

Same data type

Stack allocated
Enter fullscreen mode Exit fullscreen mode

3️⃣ Slice

A slice is a view into a portion of an array or vector.

Example

fn print_slice(slice: &[i32]) {
    println!("{:?}", slice);
}

fn main() {
    let arr = [1, 2, 3, 4, 5];
    print_slice(&arr[1..4]);
}
Enter fullscreen mode Exit fullscreen mode

Output


[2, 3, 4]
Enter fullscreen mode Exit fullscreen mode

Key Points

Dynamically sized

Borrowed (&[T])

Does not own data
Enter fullscreen mode Exit fullscreen mode

4️⃣ Struct (Named Fields)

A struct groups related data with names.

Example

struct User {
    name: String,
    age: u8,
    active: bool,
}

fn main() {
    let user = User {
        name: String::from("Ashwani"),
        age: 27,
        active: true,
    };

    println!("{} is {} years old", user.name, user.age);
}
Enter fullscreen mode Exit fullscreen mode

Output

Ashwani is 27 years old

Key Points

Fields have names

Can mix types
Enter fullscreen mode Exit fullscreen mode

Very common in real projects

5️⃣ Tuple Struct

A tuple struct is a struct without field names.

Example

struct Point(i32, i32);

fn main() {
    let p = Point(10, 20);
    println!("x={}, y={}", p.0, p.1);
}
Enter fullscreen mode Exit fullscreen mode

Output

x=10, y=20
Enter fullscreen mode Exit fullscreen mode

6️⃣ Unit Struct

A unit struct has no fields.

Example

struct Marker;

fn main() {
    let _m = Marker;
    println!("Unit struct created");
}
Enter fullscreen mode Exit fullscreen mode

Output


Unit struct created

Use Case

Marker types

Traits implementation
Enter fullscreen mode Exit fullscreen mode

Compile-time behavior

7️⃣ Enum (Data-Carrying Enum)

Enums can store different kinds of data.

Example

enum Message {
    Quit,
    Move(i32, i32),
    Write(String),
}

fn main() {
    let msg = Message::Move(10, 20);

    match msg {
        Message::Move(x, y) => println!("Move to {}, {}", x, y),
        _ => println!("Other message"),
    }
}
Enter fullscreen mode Exit fullscreen mode

Output

Move to 10, 20
Enter fullscreen mode Exit fullscreen mode

Programming on tuples

1) Swap two values (generic tuple)

fn swap<T, U>(pair: (T, U)) -> (U, T) {
    let (a, b) = pair;
    (b, a)
}

fn main() {
    let p = ("Rust", 2026);
    println!("Original: {:?}", p);
    println!("Swapped:  {:?}", swap(p));
}
Enter fullscreen mode Exit fullscreen mode

Output

Original: ("Rust", 2026)
Swapped:  (2026, "Rust")
Enter fullscreen mode Exit fullscreen mode

2) Return multiple values from a function (min, max)

fn min_max(a: i32, b: i32) -> (i32, i32) {
    if a < b { (a, b) } else { (b, a) }
}

fn main() {
    let (mn, mx) = min_max(40, 12);
    println!("min = {}, max = {}", mn, mx);
}
Enter fullscreen mode Exit fullscreen mode

Output

min = 12, max = 40
Enter fullscreen mode Exit fullscreen mode

3) Nested tuple destructuring

fn main() {
    let data = ((10, 20), ("A", "B"), true);

    let ((x, y), (s1, s2), flag) = data;

    println!("x={}, y={}", x, y);
    println!("s1={}, s2={}", s1, s2);
    println!("flag={}", flag);
}
Enter fullscreen mode Exit fullscreen mode

Output

x=10, y=20
s1=A, s2=B
flag=true
Enter fullscreen mode Exit fullscreen mode

4) Tuple indexing + updating tuple elements

fn main() {
    let mut user = ("Ashwani", 27, true);

    println!("Name: {}", user.0);
    println!("Age: {}", user.1);
    println!("Active: {}", user.2);

    user.1 = 28;
    user.2 = false;

    println!("Updated: {:?}", user);
}
Enter fullscreen mode Exit fullscreen mode

Output

Name: Ashwani
Age: 27
Active: true
Updated: ("Ashwani", 28, false)
Enter fullscreen mode Exit fullscreen mode

5) One-element tuple vs parentheses literal

fn main() {
    println!("One element tuple: {:?}", (99u32,));
    println!("Just a number:     {:?}", (99u32));
}
Enter fullscreen mode Exit fullscreen mode

Output

One element tuple: (99,)
Just a number:     99
Enter fullscreen mode Exit fullscreen mode

6) Tuple struct with methods (Point)

#[derive(Debug)]
struct Point(i32, i32);

impl Point {
    fn move_by(self, dx: i32, dy: i32) -> Point {
        Point(self.0 + dx, self.1 + dy)
    }
}

fn main() {
    let p = Point(5, 7);
    println!("Before: {:?}", p);

    let p2 = p.move_by(3, -2);
    println!("After:  {:?}", p2);
}
Enter fullscreen mode Exit fullscreen mode

Output

Before: Point(5, 7)
After:  Point(8, 5)
Enter fullscreen mode Exit fullscreen mode

7) Tuple struct (Matrix) formatting like real matrix

#[derive(Debug)]
struct Matrix(f32, f32, f32, f32);

fn pretty(m: Matrix) -> (String, String) {
    let line1 = format!("| {:>4.1} {:>4.1} |", m.0, m.1);
    let line2 = format!("| {:>4.1} {:>4.1} |", m.2, m.3);
    (line1, line2)
}

fn main() {
    let m = Matrix(1.1, 1.2, 2.1, 2.2);
    println!("Debug: {:?}", m);

    let (l1, l2) = pretty(m);
    println!("{}", l1);
    println!("{}", l2);
}
Enter fullscreen mode Exit fullscreen mode

Output

Debug: Matrix(1.1, 1.2, 2.1, 2.2)
|  1.1  1.2 |
|  2.1  2.2 |
Enter fullscreen mode Exit fullscreen mode

8) Using tuple as a key in HashMap

use std::collections::HashMap;

fn main() {
    let mut grid: HashMap<(i32, i32), &'static str> = HashMap::new();

    grid.insert((0, 0), "Home");
    grid.insert((1, 0), "Shop");
    grid.insert((1, 1), "Office");

    println!("{:?}", grid.get(&(1, 1)));
    println!("{:?}", grid.get(&(2, 2)));
}
Enter fullscreen mode Exit fullscreen mode

Output

Some("Office")
None
Enter fullscreen mode Exit fullscreen mode

9) Iterating a Vec of tuples + calculating total

fn main() {
    let cart = vec![
        ("Apple", 2, 50),   // (item, qty, price)
        ("Milk",  1, 60),
        ("Bread", 3, 40),
    ];

    let mut total = 0;
    for (name, qty, price) in cart {
        let cost = qty * price;
        total += cost;
        println!("{} x{} = {}", name, qty, cost);
    }

    println!("Total = {}", total);
}
Enter fullscreen mode Exit fullscreen mode

Output

Apple x2 = 100
Milk x1 = 60
Bread x3 = 120
Total = 280
Enter fullscreen mode Exit fullscreen mode

10) Pattern matching on tuples (match)

fn describe(p: (i32, i32)) -> &'static str {
    match p {
        (0, 0) => "Origin",
        (0, _) => "On Y-axis",
        (_, 0) => "On X-axis",
        _ => "Somewhere else",
    }
}

fn main() {
    println!("{}", describe((0, 0)));
    println!("{}", describe((0, 5)));
    println!("{}", describe((7, 0)));
    println!("{}", describe((3, 4)));
}

Enter fullscreen mode Exit fullscreen mode

Output

Origin
On Y-axis
On X-axis
Somewhere else
Enter fullscreen mode Exit fullscreen mode

Programming on array and slice

Borrow full array as slice

fn print_slice(slice: &[i32]) {
    println!("Slice: {:?}, length={}", slice, slice.len());
}

fn main() {
    let numbers = [10, 20, 30, 40];

    print_slice(&numbers);
}

Enter fullscreen mode Exit fullscreen mode

Output

Slice: [10, 20, 30, 40], length=4
Enter fullscreen mode Exit fullscreen mode

2️⃣ Slice a portion of an array

fn main() {
    let data = [1, 2, 3, 4, 5, 6];

    let part = &data[2..5];
    println!("Sliced part: {:?}", part);
}
Enter fullscreen mode Exit fullscreen mode

Output

Sliced part: [3, 4, 5]
Enter fullscreen mode Exit fullscreen mode

3️⃣ Modify array using mutable slice

fn double_values(slice: &mut [i32]) {
    for v in slice {
        *v *= 2;
    }
}

fn main() {
    let mut nums = [1, 2, 3, 4];

    double_values(&mut nums[1..3]);
    println!("Updated array: {:?}", nums);
}
Enter fullscreen mode Exit fullscreen mode

Output

Updated array: [1, 4, 6, 4]
Enter fullscreen mode Exit fullscreen mode

4️⃣ Safe access using .get() on slice

fn main() {
    let values = [10, 20, 30];

    match values.get(5) {
        Some(v) => println!("Value: {}", v),
        None => println!("Index out of bounds"),
    }
}

Enter fullscreen mode Exit fullscreen mode

Output

Index out of bounds

5️⃣ Iterating over array vs slice

fn main() {
    let arr = [5, 10, 15];

    println!("Array iteration:");
    for x in arr {
        println!("{}", x);
    }

    println!("Slice iteration:");
    for x in &arr[1..] {
        println!("{}", x);
    }
}
Enter fullscreen mode Exit fullscreen mode

Output

Array iteration:
5
10
15
Slice iteration:
10
15
Enter fullscreen mode Exit fullscreen mode

6️⃣ Empty slice behavior

fn main() {
    let empty: [i32; 0] = [];

    println!("Length: {}", empty.len());
    println!("Slice equals empty slice: {}", &empty == &[]);
}
Enter fullscreen mode Exit fullscreen mode

Output

Length: 0
Slice equals empty slice: true
Enter fullscreen mode Exit fullscreen mode

7️⃣ Split array using slices

fn main() {
    let scores = [90, 80, 70, 60, 50];

    let first_half = &scores[..2];
    let second_half = &scores[2..];

    println!("First half: {:?}", first_half);
    println!("Second half: {:?}", second_half);
}
Enter fullscreen mode Exit fullscreen mode

Output

First half: [90, 80]
Second half: [70, 60, 50]
Enter fullscreen mode Exit fullscreen mode

8️⃣ Passing array to function expecting slice

fn sum(slice: &[i32]) -> i32 {
    slice.iter().sum()
}

fn main() {
    let data = [1, 2, 3, 4];

    println!("Sum = {}", sum(&data));
}

Enter fullscreen mode Exit fullscreen mode

Output

Sum = 10
Enter fullscreen mode Exit fullscreen mode

9️⃣ Using chunks() on slices

fn main() {
    let nums = [1, 2, 3, 4, 5];

    for chunk in nums.chunks(2) {
        println!("{:?}", chunk);
    }
}
Enter fullscreen mode Exit fullscreen mode

Output

[1, 2]
[3, 4]
[5]
Enter fullscreen mode Exit fullscreen mode

🔟 Pattern matching with slices

fn main() {
    let values = [1, 2, 3];

    match values.as_slice() {
        [a, b, c] => println!("Three elements: {}, {}, {}", a, b, c),
        _ => println!("Something else"),
    }
}
Enter fullscreen mode Exit fullscreen mode

Output

Three elements: 1, 2, 3
Enter fullscreen mode Exit fullscreen mode

Top comments (0)