Rust- 变量绑定

In Rust, you bind values to a variable name using the let keyword. This is often referred to as "variable binding" because it's like binding a name to a value.

Here's a simple example:

rust 复制代码
let x = 5;

In this example, x is bound to the value 5. By default, bindings are immutable in Rust. If you try to reassign x to a different value, you'll get a compile-time error. If you want a binding to be mutable, you can use the mut keyword:

rust 复制代码
let mut x = 5;
x = 10; // This is okay because x is mutable

In Rust, you can also bind a variable to an expression. The expression will be evaluated, and the resulting value will be bound to the variable:

rust 复制代码
let x = 5 * 5; // x is bound to the value 25

Variable binding in Rust also allows for pattern matching, which enables more complex types of binding. For example, if you have a tuple, you can bind the individual elements of the tuple to different variables:

rust 复制代码
let (x, y) = (1, 2); // x is bound to 1, and y is bound to 2

Rust also requires that all variables be initialized before they are used, which prevents undefined behavior.

Lastly, Rust features a system of "shadowing" where a new variable can be declared with the name of a previous variable, effectively creating a new variable that "shadows" the old one.

rust 复制代码
let x = 5;
let x = x + 5; // x is now 10
let x = x * 2; // x is now 20

Each x is a new variable that shadows the previous x. This is not the same as mutation because these xs are new variables, they just happen to have the same name as the previous variable.

rust 复制代码
fn main() {
    /*
        变量是有作用域的,也就是在一个代码块中生存。
        代码块 {}, 也允许变量遮蔽。
     */

    // main 函数中
    let spend = 1;
    {
        // 只存在本代码块中
        let target = "面向对象";
        println!("内部 {}", target);    // 内部 面向对象

        // 遮蔽了外面的spend
        let spend = 2.0;
        println!("内部 {}", spend);     // 内部 2
    }

    // target在此作用域是不存在的
    // println!("外部 {}", target);
    println!("外部 {}", spend);         // 外部 1

    // 遮蔽了spend
    let spend = String::from("学习时间1小时");
    println!("外部 {}", spend);         // 外部 学习时间1小时

    let spend2;
    {
        let x = 2;
        spend2 = x * x;
    }
    println!("spend2: {}", spend2);     // spend2: 4

    let spend3;
    // println!("spend3: {}", spend3); // 报错,使用了未初始化的绑定
    spend3 = 1;
    println!("another binding spend3: {}", spend3); // another binding spend3: 1

    // 冻结 资源存在使用的引用时,在当前作用域中这一资源是不可被修改的。
    let mut spend4 = Box::new(1);
    let spend5 = &spend4;   // `spend4` is borrowed here
    spend4 = Box::new(100); // `spend4` is assigned to here but it was already borrowed
    println!("{}", spend4);
    println!("{}", spend5);
}
相关推荐
wadesir2 小时前
掌握Rust并发数据结构(从零开始构建线程安全的多线程应用)
数据结构·安全·rust
superman超哥10 小时前
Rust 发布 Crate 到 Crates.io:从本地到生态的完整旅程
开发语言·后端·rust·crate·crates.io
浪客川10 小时前
【百例RUST - 002】流程控制 基础语法练习题
开发语言·rust
wadesir12 小时前
高效计算欧拉函数(Rust语言实现详解)
开发语言·算法·rust
superman超哥12 小时前
Rust 零拷贝技术应用:极致性能的内存操作艺术
开发语言·后端·rust·rust零拷贝技术·内存操作
superman超哥12 小时前
Rust SIMD 指令优化:数据并行的极致性能
开发语言·后端·rust·数据并行·指令优化
受之以蒙12 小时前
用Rust + dora-rs + Webots打造自动驾驶仿真系统:Mac M1完整实战
人工智能·笔记·rust
rustfs13 小时前
RustFS x Distribution Registry,构建本地镜像仓库
分布式·安全·docker·rust·开源
rayylee13 小时前
从零开始安装Asterinas NixOS操作系统
rust·操作系统·os
superman超哥14 小时前
Rust Feature Flags 功能特性:条件编译的精妙艺术
开发语言·后端·rust·条件编译·功能特性·feature flags