Rust编程入门
简介
Rust是一种由Mozilla开发的系统级编程语言,专注于速度、内存安全和并行处理。它通过所有权模型、借用检查器及生命周期概念,在编译时确保内存安全,有效避免了空指针异常、悬挂指针和数据竞争等问题。Rust支持高效的并发编程,并提供了高层次抽象而无运行时开销,保证程序性能。其自带的包管理和构建工具Cargo简化了依赖管理和构建流程。Rust适用于多种场景,包括操作系统、嵌入式系统、WebAssembly、游戏开发及高性能网络服务。凭借现代化的语法、强大的工具链支持(如rustfmt和clippy)以及跨平台兼容性,Rust在追求高效和安全的项目中展现出色。活跃的开源社区和丰富的学习资源进一步增强了它的吸引力,使其成为开发下一代可靠软件的理想选择。
创建Rust项目
安装Rust: 各种系统中Rust的安装,请参考Rust官网说明. 在ArchLinux环境下,安装命令为
1
sudo pacman -S rust
创建新项目
1
2cargo new hello_world
cd hello_world运行
cargo new hello_world后,会建立一个文件夹hello_world, 其内部包含:Cargo.lock,Cargo.toml,src,target.编辑
src/main.rs: 打开src/main.rs文件,并添加一些简单的Rust代码,比如打印斐波那契数列的前10项:1
2
3
4
5
6
7
8
9
10
11
12
13fn fibonacci(n: u32) -> u32 {
match n {
0 => 0,
1 => 1,
_ => fibonacci(n - 1) + fibonacci(n - 2),
}
}
fn main() {
for i in 0..10 {
println!("fibonacci({}) = {}", i, fibonacci(i));
}
}编译并运行项目:
1
cargo run
运行上述命令后,将输出斐波那契数列的前10项。
使用EVCXR进行交互式探索
为了能够更灵活地试验代码片段而不必每次都通过cargo run执行整个程序,我们可以使用evcxr,这是一个为Rust设计的Jupyter内核,也可以作为独立的REPL使用。
安装
EVCXR:1
cargo install evcxr
启动
EVCXR1
evcxr
在
EVCXR中试验代码:一旦进入了evcxr环境,您可以直接输入Rust表达式或小段代码进行试验,例如尝试上面定义的斐波那契函数:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15// 定义斐波那契函数
:dep num_traits
fn fibonacci(n: u32) -> u32 {
match n {
0 => 0,
1 => 1,
_ => fibonacci(n - 1) + fibonacci(n - 2),
}
}
// 测试斐波那契函数
for i in 0..10 {
println!("fibonacci({}) = {}", i, fibonacci(i));
}请注意,在
evcxr中,您可能需要先声明对外部依赖项(如果有的话)使用:dep命令。在这个特定的例子中,我们实际上不需要额外的依赖项,所以可以忽略:dep num_traits这一行。 通过这种方式,您可以在不离开终端的情况下快速测试Rust代码片段,这对于学习语言特性、调试问题或简单地验证想法都非常有用。此外,由于evcxr支持类似Jupyter notebook的交互方式,它也适合用于教学和演示目的。
Rust代码编译
确保处于正确的目录: 请确保您位于包含
Cargo.toml文件的项目根目录下。这个文件定义了项目的配置、依赖和其他相关信息。在上述例子中,就是位于目录hello_world下.编译项目:
1
cargo build
这将根据当前环境(调试或发布)编译项目。默认情况下,
cargo build会在调试模式下进行编译,生成的二进制文件会位于target/debug/目录下。编译优化版本(发布模式):
编译优化后的版本(适用于生产环境) 1
cargo build --release
这将在
target/release/目录下生成经过优化的二进制文件。相比调试模式,发布模式下的编译会花费更多时间,但是生成的二进制文件通常更小且执行速度更快。直接运行可执行文件:
- 对于调试模式编译的二进制文件,可以直接从
target/debug/目录下运行:1
./target/debug/your_project_name
- 对于发布模式编译的二进制文件,则从
target/release/目录下运行:1
./target/release/your_project_name
这里的
your_project_name是指您Cargo项目的名称,也就是Cargo.toml文件中的[package] name字段所指定的名字。