Skip to content

Rust: Basic Syntax and Concepts

Variables in Rust are unique compared to other languages because they are immutable by default. This feature helps prevent bugs by ensuring that variables cannot change unexpectedly. Here we discuss the basic syntax and concepts of Rust

Immutable Variables

In Rust, if you declare a variable without the mut keyword, it’s immutable. This means you cannot change its value once it’s been set.

fn main() {
    let x = 10;
    println!("The value of x is: {}", x);
    // x = 60; // This line would cause a compilation error
}
Basic Syntax and Concepts

Mutable Variables

If you need to change a variable’s value, you can declare it as mutable using the mut keyword.

fn main() {
    let mut y = 10;
    println!("The initial value of y is: {}", y);
    y = 20;
    println!("The new value of y is: {}", y);
}
using System;

class Program
{
    static void Main()
    {
        int y = 10;
        Console.WriteLine("The initial value of y is: " + y);
        y = 20;
        Console.WriteLine("The new value of y is: " + y);
    }
}
public class Main {
    public static void main(String[] args) {
        int y = 10;
        System.out.println("The initial value of y is: " + y);
        y = 20;
        System.out.println("The new value of y is: " + y);
    }
}
Mutable Variables

Shadowing in Rust

Rust allows you to “shadow” a variable by redeclaring it with the same name. This can be useful for transforming data without needing to come up with new variable names.

fn main() {
    let x = 5;
    let x = x + 1;
    let x = x * 2;
    println!("The value of x is: {}", x); // Outputs 12
}
using System;

class Program
{
    static void Main()
    {
        int x = 5;
        x = x + 1;
        x = x * 2;
        Console.WriteLine($"The value of x is: {x}"); // Outputs 12
    }
}
public class Main {
    public static void main(String[] args) {
        int x = 5;
        x = x + 1;
        x = x * 2;
        System.out.println("The value of x is: " + x); // Outputs 12
    }
}

Data Types and Type Inference

Rust’s type system is robust, with various data types that you can use. The compiler also provides type inference to make your code cleaner and more readable.

Scalar Types

Integer Types

Integers in Rust come in both signed (i8, i16, i32, i64, i128) and unsigned (u8, u16, u32, u64, u128) forms, each differing in size and range.

Floating-Point Types

For floating-point numbers, Rust supports f32 and f64, with f64 it is the default due to its precision.

Boolean Type

The bool type can be either true or false.

Character Type

The char type represents a single Unicode scalar value, which can be more than just ASCII.

Scalar types variable
Scalar Types

Compound Types

Tuples

Tuples group together multiple values of different types.

let tup: (i32, f64, u8) = (500, 6.4, 1);

Arrays

Arrays in Rust have a fixed length and consist of elements of the same type.

let a = [1, 2, 3, 4, 5, 6, 7];

Defining Functions

Functions in Rust are defined using the fn keyword.

fn main() {
    println!("Hi world");
}

fn add(a: i32, b: i32) -> i32 {
    a + b
}
using System;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Hi world");
    }

    static int Add(int a, int b)
    {
        return a + b;
    }
}
public class Main {
    public static void main(String[] args) {
        System.out.println("Hi world");
    }

    public static int add(int a, int b) {
        return a + b;
    }
}

Control Flow Constructs

Rust offers several constructs to control the flow of your program.

If and Else Statements

Conditional statements in Rust are straightforward and similar to other languages.

fn main() {
    let number = 6;
    if number % 4 == 0 {
        println!("Number is divisible by 4");
    } else if number % 3 == 0 {
        println!("Number is divisible by 3");
    } else {
        println!("Number is not divisible by 3 or 4");
    }
}
using System;

class Program
{
    static void Main()
    {
        int number = 6;
        if (number % 4 == 0)
        {
            Console.WriteLine("Number is divisible by 4");
        }
        else if (number % 3 == 0)
        {
            Console.WriteLine("Number is divisible by 3");
        }
        else
        {
            Console.WriteLine("Number is not divisible by 3 or 4");
        }
    }
}
public class Main {
    public static void main(String[] args) {
        int number = 6;
        if (number % 4 == 0) {
            System.out.println("Number is divisible by 4");
        } else if (number % 3 == 0) {
            System.out.println("Number is divisible by 3");
        } else {
            System.out.println("Number is not divisible by 3 or 4");
        }
    }
}

Looping Constructs

Rust provides various ways to loop through code.

The loop keyword creates an infinite loop that must be manually terminated.

fn main() {
    let mut counter = 0;
    let result = loop {
        counter += 1;
        if counter == 10 {
            break counter * 2;
        }
    };
    println!("The result is: {}", result);
}
using System;

class Program
{
    static void Main()
    {
        int counter = 0;
        int result = 0;

        while (true)
        {
            counter++;
            if (counter == 10)
            {
                result = counter * 2;
                break;
            }
        }

        Console.WriteLine("The result is: " + result);
    }
}
public class Main {
    public static void main(String[] args) {
        int counter = 0;
        int result = 0;

        while (true) {
            counter++;
            if (counter == 10) {
                result = counter * 2;
                break;
            }
        }

        System.out.println("The result is: " + result);
    }
}

The while loop continues running as long as a condition is true.

fn main() {
    let mut number = 3;
    while number != 0 {
        println!("{}!", number);
        number -= 1;
    }
    println!("LIFTOFF!!!");
}
using System;

class Program
{
    static void Main()
    {
        int number = 3;
        while (number != 0)
        {
            Console.WriteLine($"{number}!");
            number--;
        }
        Console.WriteLine("LIFTOFF!!!");
    }
}
public class Main {
    public static void main(String[] args) {
        int number = 3;
        while (number != 0) {
            System.out.println(number + "!");
            number--;
        }
        System.out.println("LIFTOFF!!!");
    }
}

The for loop iterates over a range or collection.

fn main() {
    let a = [10, 20, 30, 40, 50];
    for element in a.iter() {
        println!("The value is: {}", element);
    }
}
using System;

class Program
{
    static void Main(string[] args)
    {
        int[] a = { 10, 20, 30, 40, 50 };
        foreach (var element in a)
        {
            Console.WriteLine("The value is: " + element);
        }
    }
}
public class Main {
    public static void main(String[] args) {
        int[] a = { 10, 20, 30, 40, 50 };
        for (int element : a) {
            System.out.println("The value is: " + element);
        }
    }
}

Comments and Documentation

Comments and documentation help explain and maintain your code. Rust has several ways to add comments and documentation.

Single-Line Comments

Use // for single-line comments.

Multi-Line Comments

Use /* ... */ for multi-line comments.

Use /// for item-level documentation and //! for module-level documentation.

Item-Level and Module-Level Documentation

/// Adds two numbers together.
/// # Examples

//! This is a module-level documentation comment
//! It provides an overview of the module's purpose and usage.

Practical Examples in Rust

To tie everything together, let’s look at a practical example. Here’s a basic calculator that adds two numbers.

Calculator adds two numbers

Conclusion

Rust is a powerful and versatile language with a strong focus on safety and performance. Understanding its basic syntax and concepts, such as variables, data types, functions, and control flow, provides a solid foundation for further exploration and mastery. By leveraging Rust’s robust features and clear syntax, you can write efficient, reliable, and maintainable code.

FAQs

Q1: What makes Rust different from other programming languages? A: Rust is designed with a focus on safety and performance, particularly for concurrent programming. Its ownership system ensures memory safety without needing a garbage collector.

Q2: Can I use Rust for web development? A: Yes, Rust can be used for web development. Frameworks like Rocket and Actix provide tools for building web applications.

Q3: How does Rust handle memory management? A: Rust uses an ownership system with rules that the compiler checks at compile time, ensuring memory safety without needing a garbage collector.

Q4: Is Rust suitable for beginners? A: Rust has a steep learning curve due to its strict rules, but its clear syntax and comprehensive documentation make it accessible to dedicated beginners.

Q5: What are some popular projects built with Rust? A: Notable projects include Mozilla’s Servo browser engine, the Redox operating system, and Dropbox’s file synchronization engine.


Now that you’ve explored the basic syntax and concepts of Rust, you’re well on your way to becoming proficient in this modern, efficient programming language. Happy coding!