Rust¶
Systems programming with memory safety
Overview¶
Rust is a modern systems programming language that guarantees memory safety without a garbage collector. With run, you can compile and execute Rust code instantly without managing Cargo projects or build configurations.
The Rust engine in run compiles your code using rustc and executes the resulting binary. Each execution is independent, so there's no persistent state between commands (unlike Python or JavaScript).
Language Aliases¶
You can invoke Rust using these aliases:
run rust "fn main() { println!(\"Hello\"); }"
run rs "fn main() { println!(\"Hello\"); }"
# Output: Hello (x2)
Basic Usage - Inline Code¶
Execute Rust code directly. Note that Rust requires a main function:
Hello World¶
Variables and Types¶
String Formatting¶
run rust "fn main() { let name = \"Alice\"; println!(\"Hello, {}!\", name); }"
# Output: Hello, Alice!
Arithmetic¶
run rust "fn main() { let result = 10 + 20 * 3; println!(\"Result: {}\", result); }"
# Output: Result: 70
Multi-line Code¶
Important: Use Heredoc for Multi-line Code
Avoid multi-line strings - they cause shell errors with Rust arrays:
# FAILS: zsh: event not found: [1,
run rust "
fn main() {
let nums = vec![1, 2, 3];
println!(\"{:?}\", nums);
}
"
# WORKS: Use heredoc
run rust << 'EOF'
fn main() {
let nums = vec![1, 2, 3];
println!("{:?}", nums);
}
EOF
# WORKS: Single-line
run rust 'fn main() { let nums = vec![1,2,3]; println!("{:?}", nums); }'
File Execution¶
Execute Rust source files:
# Create a Rust file
cat > hello.rs << 'EOF'
fn main() {
println!("Hello from Rust file!");
}
EOF
run rust hello.rs
# Output: Hello from Rust file!
Complex Example - Fibonacci¶
# Create a Fibonacci program
cat > fib.rs << 'EOF'
fn fibonacci(n: u32) -> u32 {
match n {
0 => 0,
1 => 1,
_ => fibonacci(n - 1) + fibonacci(n - 2),
}
}
fn main() {
for i in 0..10 {
println!("F({}) = {}", i, fibonacci(i));
}
}
EOF
run rust fib.rs
# Output:
# F(0) = 0
# F(1) = 1
# F(2) = 1
# F(3) = 2
# F(4) = 3
# F(5) = 5
# F(6) = 8
# F(7) = 13
# F(8) = 21
# F(9) = 34
REPL Behavior¶
Rust's REPL maintains state across commands. Variables, functions, and imports persist within the same REPL session.
Start the REPL with run rust, then type commands at the rust>>> prompt:
❯ run rust
run universal REPL. Type :help for commands.
rust>>> let x = 42;
rust>>> println!("{}", x);
42
rust>>>
REPL Mode - Interactive Rust¶
Start an interactive Rust REPL with 'run rust'. Rust's REPL compiles each snippet:
$ run rust
run universal REPL. Type :help for commands.
rust>>> let x = 10;
rust>>> println!("{}", x);
10
rust>>>
Advanced Features¶
Rust's powerful features work seamlessly with run:
Pattern Matching¶
run rust "
fn main() {
let number = 7;
match number {
1 => println!(\"One\"),
2..=5 => println!(\"Between 2 and 5\"),
6 | 7 | 8 => println!(\"Six, Seven, or Eight\"),
_ => println!(\"Something else\"),
}
}
"
# Output: Six, Seven, or Eight
Iterators and Closures¶
run rust "
fn main() {
let numbers: Vec<i32> = (1..=10).collect();
let sum: i32 = numbers.iter().sum();
let evens: Vec<i32> = numbers.iter().filter(|&&x| x % 2 == 0).copied().collect();
println!(\"Sum: {}\", sum);
println!(\"Evens: {:?}\", evens);
}
"
# Output:
# Sum: 55
# Evens: [2, 4, 6, 8, 10]
Structs and Methods¶
run rust "
struct Rectangle {
width: u32,
height: u32,
}
impl Rectangle {
fn area(&self) -> u32 {
self.width * self.height
}
}
fn main() {
let rect = Rectangle { width: 10, height: 20 };
println!(\"Area: {}\", rect.area());
}
"
# Output: Area: 200
Error Handling with Result¶
run rust "
fn divide(a: f64, b: f64) -> Result<f64, String> {
if b == 0.0 {
Err(String::from(\"Division by zero\"))
} else {
Ok(a / b)
}
}
fn main() {
match divide(10.0, 2.0) {
Ok(result) => println!(\"Result: {}\", result),
Err(e) => println!(\"Error: {}\", e),
}
}
"
# Output: Result: 5
Common Use Cases¶
- Learning Rust syntax and features
- Testing algorithms and data structures
- Prototyping systems-level code
- Benchmarking performance-critical code
- Exploring Rust's ownership and borrowing
- Quick compilation checks
Compilation Errors¶
Rust's compiler provides detailed error messages:
run rust "fn main() { let x: i32 = \"hello\"; }"
# Output: error[E0308]: mismatched types
# expected `i32`, found `&str`
run rust "fn main() { let s = String::from(\"hello\"); let s2 = s; println!(\"{}\", s); }"
# Output: error[E0382]: borrow of moved value: `s`
Limitations¶
- No persistent state between REPL commands
- External crates (dependencies) are not supported
- Each execution requires compilation (slower than interpreted languages)
- Must include a main function for inline code
- No Cargo.toml or project management features