前端都能看懂的rust入门教程(一)

153 阅读4分钟

阅读本文,你将学会:使用cargo创建和运行rust项目,能够声明变量、常量、函数。

环境安装

环境安装直接参考官网:rust-lang.org/zh-CN/tools…

安装完成后执行rustc --versioncargo --version,如果没问题会有如下类似输出

rustc 1.92.0 (ded5c06cf 2025-12-08)
cargo 1.92.0 (344c4567c 2025-10-21)

vsocde 插件安装

vscode安装插件

image.png

项目创建

执行命令cargo new test-rust可创建项目,类似前端脚手架。

image.png 运行cargo run,如果控制台输出Hello, world,那便恭喜你,正式进入rust世界了。

image.png

rust中的声明

不同于其他教程先介绍类型,本文先介绍最简单的声明语法。

1. 变量声明

基本变量声明

let x = 5;               // 不可变变量(默认)
let mut y = 10;          // 可变变量
let z: i32 = 15;         // 显式指定类型

变量重声明

rust中变量可以重声明,并且有个专业名词——遮蔽(Shadowing)

let x = 5;
let x = x + 1;           // 可以重新声明同名变量
let x = x * 2;           // 类型可以改变

可变变量与不可变变量

上面的demo中有个关键字mut,它的作用是标记变量为可变变量。

rust中变量默认都是不可改的,这一点与js不一样。要声明一个可变变量,必须要加mut关键字。

image.png

    let x = 5; // 不可变变量(默认)
    x = x + 1; // 错误:不能修改不可变变量

    let mut y = 10; // 可变变量
    y = y + 10; // 正确:可以修改可变变量

不可变变量可以重新声明,重新声明时可以改变类型。

 let x = 5; // 不可变变量(默认)
 let x = 'x';

2. 常量声明

const MAX_POINTS: u32 = 100_000;      // 编译时常量
static GLOBAL_VALUE: i32 = 42;        // 静态变量
static mut COUNTER: u32 = 0;          // 可变静态变量(不安全)

static常量可以是可变的,但如果声明为可变,使用的时候必须要包裹unsafe,如

  println!(
        "Hello, world!COUNTER={}",
      
        unsafe { COUNTER }
    );
}

let,const,static区别

既然let默认也是不可改的,那么这三者声明有何区别呢?只要记住以下四点就足够了。

  • 大小写: 最直观的一点,作为常量声明,const和static必须大写,而let必须小写。(rust使用蛇形命名规范,不允许使用驼峰)
  • 类型指定:const和static必须声明其类型
  • 作用域:let只能在块作用域内,但const和static可以是全局作用域
  • 是否允许重新声明:const和static不允许重新声明,但let可以
  • 初始化:let允许只声明不初始化,但const和static声明时必须初始化,并且const常量必须在编译时可求值(不允许使用const B:i32 = x * 2const B:i32 = get_v()这种形式,但可以const B: i32 = 4 / 2;
let,const,static区别一栏表
特性letconststatic
作用域块作用域可以在任意作用域全局作用域
生命周期作用域内编译时常量,无运行时生命周期整个程序运行期间
内存分配栈上编译时替换(通常不分配内存)静态内存区
可变性默认不可变,可用 mut永远不可变默认不可变,可用 mut(需要 unsafe
线程安全局部,线程安全线程安全不可变:线程安全;可变:需要同步
类型注解可省略(类型推断)必须显式注明必须显式注明
初始化时机运行时编译时编译时(在程序启动前初始化)

3. 函数声明

类似ts的function,可以指定返回值类型

fn greet(name: &str) {
    println!("Hello, {}!", name);
}

fn add(x: i32, y: i32) -> i32 {
    x + y  // 没有分号,作为返回值
}

4. 结构体声明

类似ts的class和interface

struct User {
    username: String,
    email: String,
    active: bool,
}

// 实例化
let user = User {
    email: String::from("test@example.com"),
    username: String::from("john"),
    active: true,
};

impl

为结构体提供实现

impl User {
    // 关联函数(类似静态方法)
    fn new(username: String, email: String) -> User {
        User {
            username,
            email,
            active: true,
        }
    }
    
    // 方法
    fn get_username(&self) -> &str {
        &self.username
    }
}

5. 泛型

类似ts中的泛型,

struct Point<T> {
    x: T,
    y: T,
}

6. 枚举声明

类似ts的枚举,但并不是k-v形式

enum IpAddrKind {
    V4,
    V6,
}

7. 类型别名

这一点和ts的type声明很像

type Kilometers = i32;
type Result<T> = std::result::Result<T, std::io::Error>;

8. 其他声明

rust中还有其他特殊的声明,比如traitmod、生命周期声明等语法,后续将详细介绍。