Constants in Rust are immutable values that are bound to a name and are valid for the entire duration of a program.
Unlike regular variables, constants must have a type annotation and are evaluated at compile time.
What You’ll Learn
1. What Are Constants in Rust?
A constant in Rust:
- Is declared using the const keyword.
- Must have an explicit type.
- Is evaluated at compile time.
- Cannot be mutated.
Constants are typically used for values that are fixed and used throughout the program, like mathematical constants or configuration settings.
2. Declaring Constants
Constants must be declared with:
- The const keyword.
- A name in uppercase by convention (e.g., PI, MAX_LIMIT).
- A type annotation.
- A value that is constant and valid at compile time.
Example: Declaring Constants
const PI: f64 = 3.14159; // Mathematical constant const MAX_LIMIT: u32 = 100; // Application-specific constant fn main() { println!("PI: {}", PI); println!("Max Limit: {}", MAX_LIMIT); }
3. Differences Between Constants and Variables
Feature | Constant | Variable |
---|---|---|
Declaration | const | let |
Mutability | Always immutable | Can be mutable (let mut) |
Type Annotation | Mandatory | Optional |
Scope | Global or local | Typically block-scoped |
Evaluation Time | Compile time | Run time |
Example: Constants vs Variables
const SECONDS_IN_A_MINUTE: u32 = 60; // Constant fn main() { let mut seconds = 45; // Mutable variable println!("Seconds: {}", seconds); seconds = SECONDS_IN_A_MINUTE; // Assign constant value to variable println!("Updated Seconds: {}", seconds); }
4. Best Practices for Constants
4.1 Use Uppercase Names
By convention, constants are written in uppercase with underscores for readability.
const MAX_USERS: u32 = 1000;
4.2 Use Constants for Fixed Values
Use constants to avoid hardcoding values throughout your program.
const TAX_RATE: f64 = 0.15; fn calculate_price(price: f64) -> f64 { price + (price * TAX_RATE) } fn main() { let price = 100.0; println!("Final price: {:.2}", calculate_price(price)); }
4.3 Use Constants for Reusable Values
Constants are perfect for reusable configurations.
const APP_NAME: &str = "RustApp"; const VERSION: &str = "1.0.0"; fn main() { println!("{} - Version {}", APP_NAME, VERSION); }
5. Using Constants in Practical Examples
5.1 Mathematical Calculations
Constants are commonly used for mathematical operations.
const PI: f64 = 3.14159; fn calculate_circumference(radius: f64) -> f64 { 2.0 * PI * radius } fn main() { let radius = 5.0; println!("Circumference: {:.2}", calculate_circumference(radius)); }
5.2 Application Configuration
Use constants for application-wide configurations.
const MAX_RETRIES: u32 = 3; const TIMEOUT: u64 = 5000; // in milliseconds fn main() { println!("Max retries: {}", MAX_RETRIES); println!("Timeout: {}ms", TIMEOUT); }
5.3 Environment-Specific Constants
You can define environment-specific constants for conditional builds.
#[cfg(target_os = "windows")] const OS_NAME: &str = "Windows"; #[cfg(target_os = "linux")] const OS_NAME: &str = "Linux"; fn main() { println!("Operating System: {}", OS_NAME); }
5.4 Constants for Complex Data Types
Constants can also be used with complex data types, such as tuples or arrays.
const COLORS: [&str; 3] = ["Red", "Green", "Blue"]; fn main() { for color in COLORS.iter() { println!("{}", color); } }
5.5 Constants with Conditional Logic
Use constants to define settings based on compile-time flags.
#[cfg(debug_assertions)] const MODE: &str = "Debug"; #[cfg(not(debug_assertions))] const MODE: &str = "Release"; fn main() { println!("Running in {} mode", MODE); }
5.6 Constants in Modules
Constants can be declared in modules for better organization.
mod config { pub const APP_NAME: &str = "RustApp"; pub const VERSION: &str = "1.0.0"; } fn main() { println!("{} - Version {}", config::APP_NAME, config::VERSION); }
6. Constants in Performance-Critical Code
Since constants are evaluated at compile time, they do not incur any runtime cost. This makes them ideal for performance-critical code.
Example: Fast Array Initialization
const SIZE: usize = 100; fn main() { let numbers: [i32; SIZE] = [0; SIZE]; // Initialize an array with SIZE elements println!("Array size: {}", numbers.len()); }
7. Summary
Key Features
- Constants are declared using const.
- They must have an explicit type annotation.
- They are immutable and evaluated at compile time.
Common Use Cases
- Replacing hardcoded values.
- Defining application-wide settings or configurations.
- Improving code readability and maintainability.
Best Practices
- Use uppercase names with underscores for readability.
- Use constants for any values that are unlikely to change.
- Group constants into modules for better organization.
By mastering constants, you can write more robust and efficient Rust programs