Rust基础-part2-变量和可变类型

Rust基础[part2]_变量和可变类型

可变变量与不可变变量

可以不指定数据类型

可变变量------mutable

rust 复制代码
fn immutable() {
    let x = 5;
    println!("The value of x is: {}", x);
}

不可变变量------immutable

rust 复制代码
fn mutable() {
    let mut y = 10;
    println!("The value of y is: {}", y);
    y = 15;
    println!("The value of y is now: {}", y);
}

常量------constants

  • 需要制定明确的数据类型,并且需要使用大写字母

  • 需要使用常量表达式进行赋值

  • 不支持重定义(遮蔽)

rust 复制代码
const NUM: i32 = 5;
const THREE_HOURS: i32 = 60 * 60 * 3;

不可变量和常量的区别

  • 常量在编译期就就确定了值,不能在运行时进行改变; 不可变量知道运行期才能确认下来。
  • 常量不可修改,不可变变量可以通过shadowing来进行修改
  • 常量必须声明类型,不可变变量不需要声明类型。
  • 常量必须使用大写字母。

静态变量------static

需要通过mut来指定可变, unsafe 块是必须的,因为静态变量在多线程环境中可能会引发数据竞争问题。

rust 复制代码
static mut NUMBER: i32 = 10;

fn static_num() {
    unsafe {
        println!("static NUMBER: {}", NUMBER);
    }// 这里可以访问静态变量NUMBER 
}

作用域scope和遮蔽shadowing

rust 复制代码
fn binding() {
    // 绑定生存于main函数中
    let long_lived_binding = 1;
    
    // 代码块, 比main函数拥有更小的作用域
    {
        // 绑定生存于代码块中
        // 这里的short_lived_binding只在这个代码块中有效
        let short_lived_binding = 2;
        println!("short_lived_binding: {}", short_lived_binding);
        // 遮蔽,在作用域中可以遮蔽成功
        let short_lived_binding = 3;
        println!("short_lived_binding after shadowing: {}", short_lived_binding);

        println!("long_lived_binding: {}", long_lived_binding);
        // 遮蔽长期绑定的变量
        // 这里的long_lived_binding会遮蔽外层的同名变量
        let long_lived_binding = 4;
        println!("long_lived_binding after shadowing: {}", long_lived_binding);
    }
    println!("long_lived_binding after block: {}", long_lived_binding);
    // println!("short_lived_binding after block: {}", short_lived_binding); // 这里会报错,因为short_lived_binding在代码块外不可见
    // 遮蔽长期绑定的变量
    let long_lived_binding = 5_f32;
    println!("long_lived_binding after shadowing: {}", long_lived_binding);

}
相关推荐
龘龍龙3 分钟前
Python基础(八)
开发语言·python
期待のcode24 分钟前
@RequestBody的伪表单提交场景
java·前端·vue.js·后端
王中阳Go39 分钟前
手把手教你用 Go + Eino 搭建一个企业级 RAG 知识库(含代码与踩坑)
人工智能·后端·go
幺零九零零1 小时前
Golang-Swagger
开发语言·后端·golang
moyueheng1 小时前
AG-UI 事件类型全解析:构建 AI 代理与 UI 的实时通信桥梁
后端
兔丝1 小时前
ThinkPHP8 常见并发场景解决方案文档
redis·后端
用户3521802454751 小时前
🥯2025 年终极避坑指南:Spring Boot 2.7 + 3.2 混合集群的 Redis + OAuth2 序列化血泪史
java·后端·spring cloud
陌路物是人非1 小时前
记一个 @Resource BUG
java·开发语言·bug
怎么就重名了1 小时前
记录Qt的UDP通信丢包问题
开发语言·qt·udp
superman超哥2 小时前
Rust 闭包的定义与捕获:所有权系统下的函数式编程
开发语言·后端·rust·函数式编程·rust闭包·闭包的定义与捕获