JKSJ-Rust训练营(1期同步更新)

91 阅读4分钟

JKSJ-Rust训练营(1期同步更新)

JKSJ-Rust训练营(1期同步更新)

获取ZY↑↑方打开链接↑↑

Rust 是一门系统级编程语言,以其安全性、高性能和现代化的编程特性而闻名。Rust 设计之初就致力于解决 C/C++ 中常见的内存安全问题,同时提供了类似于 C/C++ 的运行速度。对于想要从事系统编程、游戏开发、网络服务器开发等领域的人来说,学习 Rust 是一个很好的选择。

Rust 程序设计的基本要素

1. 变量声明

在 Rust 中,变量默认是不可变的,可以通过 let 关键字声明变量:

rust浅色版本fn main() {    let x = 5; // 不可变变量    println!("The value of x is: {}", x);}

如果你想声明一个可变变量,需要加上 mut 关键字:

rust浅色版本fn main() {    let mut y = 5;    y = 6; // 修改变量值    println!("The value of y is: {}", y);}

2. 数据类型

Rust 支持多种数据类型,包括整型、浮点型、布尔型、字符型等:

rust浅色版本fn main() {    let integer: i32 = 10;    let float: f64 = 3.14;    let boolean: bool = true;    let character: char = 'A';}

3. 函数定义

函数使用 fn 关键字定义,并可以返回一个值:

rust浅色版本fn add_one(x: i32) -> i32 {    x + 1}fn main() {    let result = add_one(5);    println!("The result is: {}", result);}

4. 条件语句

Rust 支持 if 和 else 语句:

rust浅色版本fn main() {    let number = 3;    if number < 5 {        println!("number is less than five");    } else {        println!("number is greater than or equal to five");    }}

5. 循环语句

Rust 支持 for 和 while 循环:

rust浅色版本fn main() {    let mut count = 0;    while count < 5 {        println!("count is: {}", count);        count += 1;    }    for number in 1..=5 {        println!("number is: {}", number);    }}

6. 数组与向量

数组和向量都是用来存储一系列元素的数据结构,但向量是动态大小的:

rust浅色版本fn main() {    let numbers = [1, 2, 3, 4, 5]; // 数组    println!("The third element is: {}", numbers[2]);    let mut vector = vec![1, 2, 3]; // 向量    vector.push(4);    println!("The length of the vector is: {}", vector.len());}

7. 所有权与借用

所有权(Ownership)和借用(Borrowing)是 Rust 中独特的概念,用于确保内存安全:

rust浅色版本fn main() {    let s1 = String::from("hello");    let len = calculate_length(&s1); // 借用 s1    println!("The length of '{}' is {}.", s1, len);}fn calculate_length(s: &String) -> usize {    s.len()}

8. 模式匹配

Rust 支持强大的模式匹配功能:

rust浅色版本fn main() {    let number = Some(5);    match number {        Some(i) => println!("Matched, i = {:}", i),        None => println!("None value"),    }}

9. 错误处理

Rust 使用 Result 和 Option 类型来处理错误:

rust浅色版本fn divide(x: i32, y: i32) -> Result<i32, &'static str> {    if y == 0 {        Err("Cannot divide by zero")    } else {        Ok(x / y)    }}fn main() {    let result = divide(10, 0);    match result {        Ok(value) => println!("The result is {}", value),        Err(e) => println!("Error: {}", e),    }}

实战案例:实现一个简单的HTTP服务器

介绍

我们将使用 hyper 库来实现一个简单的HTTP服务器。hyper 是一个流行的 Rust HTTP 库,支持 HTTP/1.x 和 HTTP/2。

安装依赖

首先,我们需要在 Cargo.toml 文件中添加 hyper 依赖:

toml浅色版本[dependencies]hyper = "0.14"tokio = { version = "1", features = ["full"] }

编写服务器代码

创建一个名为 main.rs 的文件,并编写以下代码:

rust浅色版本use hyper::{Body, Response, Server};use hyper::service::{make_service_fn, service_fn};use hyper::{Method, StatusCode};use std::convert::Infallible;use std::net::SocketAddr;async fn handle(_: hyper::Request<Body>) -> Result<hyper::Response<Body>, Infallible> {    let response = match Method::GET {        Method::GET => Response::new(Body::from("Hello, World!")),        _ => Response::builder()            .status(StatusCode::NOT_FOUND)            .body(Body::empty())            .unwrap(),    };    Ok(response)}#[tokio::main]async fn main() {    let addr = SocketAddr::from(([127, 0, 0, 1], 8080));    let make_service = make_service_fn(|_conn| async {        Ok::<_, Infallible>(service_fn(handle))    });    let server = Server::bind(&addr).serve(make_service);    if let Err(e) = server.await {        eprintln!("server error: {}", e);    }}

运行服务器

运行以下命令来启动服务器:

bash浅色版本cargo run

然后,打开浏览器并访问 http://localhost:8080,你应该可以看到 "Hello, World!" 的输出。

总结

以上介绍了 Rust 的基本语法和一些常用功能,以及如何使用 Rust 和 hyper 库来实现一个简单的 HTTP 服务器。通过这些例子,你可以开始探索 Rust 的更多特性和应用。随着你对 Rust 的理解和经验的增长,你可以尝试更复杂的项目,如游戏开发、网络应用等。