一、基本语法
Rust语言是一门用于可靠性、安全性和并发性的现代编程语言。它的语法灵活,支持函数定义、循环、if语句等。Rust有两种函数语法:函数声明和函数定义:
fn main() {
println!("Hello, world!");
}
Rust中的变量默认是不可变的,如果需要定义可变变量,需要使用mut关键词:
let mut x = 5;
x = 6;
Rust的控制流语句包括if、while和for循环:
fn main() {
let x = 5;
let y = if x == 5 { 10 } else { 15 };
println!("{}", y);
let mut i = 0;
while i < 5 {
println!("i = {}", i);
i += 1;
}
let a = [1, 2, 3, 4, 5];
for element in a.iter() {
println!("{}", element);
}
}
二、所有权和借用
Rust的所有权机制确保内存安全,不会出现空指针、野指针等问题。在Rust中,每个值都有一个变量,称为所有者。任何时候,只能有一个所有者。如果所有权转移,那么所有权将从旧的所有者移动到新的所有者:
fn main() {
let s1 = String::from("hello");
let s2 = s1;
println!("{}", s1); // 错误,s1的所有权已经转移给了s2
println!("{}", s2); // 输出:hello
}
Rust还提供了借用机制,允许临时借用变量的所有权,而不是将所有权转移给函数或方法:
fn calculate_length(s: &String) -> usize {
s.len()
}
fn main() {
let s = String::from("hello");
let len = calculate_length(&s);
println!("The length of '{}' is {}.", s, len);
}
三、模块化编程
Rust允许将代码分为多个模块,以便更好地组织和管理代码。可以使用mod关键词定义模块,一个模块可以包含多个子模块:
mod my_module {
mod sub_module {
fn sub_function() {
println!("Sub function");
}
}
pub fn my_function() {
println!("My function");
sub_module::sub_function();
}
}
fn main() {
my_module::my_function();
}
四、生命周期
Rust的内存安全是通过生命周期机制来实现的,生命周期描述了变量的生命周期,确保任何引用始终指向有效的内存。生命周期使用'标记来声明,生命周期必须满足引用的范围的要求:
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() {
x
} else {
y
}
}
fn main() {
let string1 = String::from("long string is long");
let result;
{
let string2 = String::from("xyz");
result = longest(string1.as_str(), string2.as_str());
}
println!("The longest string is {}.", result);
}
五、并发编程
Rust提供了基于线程的并发编程支持。Rust的并发编程机制使用通道(Channel)和消息传递来实现线程间的通信。通道分为同步通道和异步通道,同步通道用于在线程之间进行同步,异步通道用于保持线程之间的独立性:
use std::sync::mpsc;
use std::thread;
fn main() {
let (tx, rx) = mpsc::channel();
thread::spawn(move || {
let val = String::from("hi");
tx.send(val).unwrap();
});
let received = rx.recv().unwrap();
println!("{}", received);
}
六、Futures和异步编程
Rust的futures和异步编程支持使异步编程变得容易。Future表示一个可能完成或失败的异步操作,因此可以创建和组合Future来实现异步代码的编写:
use futures::future::Future;
use futures::executor::block_on;
async fn hello_world() {
println!("hello, world!");
}
fn main() {
let future = hello_world();
block_on(future);
}