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);
}
相关推荐
王燕龙(大卫)9 小时前
rust:trait
开发语言·后端·rust
q***876013 小时前
项目升级Sass版本或升级Element Plus版本遇到的问题
前端·rust·sass
Bigger15 小时前
Tauri(十九)——实现 macOS 划词监控的完整实践
前端·rust·app
g***B73816 小时前
Rust在网络中的Tokio
开发语言·网络·rust
疏狂难除16 小时前
尝试rust与python的混合编程(二)
数据库·python·rust
9***P33417 小时前
Rust在网络中的Rocket
开发语言·后端·rust
空白诗1 天前
mdcat 在 HarmonyOS 上的构建与适配
后端·安全·华为·rust·harmonyos
Rust语言中文社区1 天前
【Rust日报】Dioxus 用起来有趣吗?
开发语言·后端·rust
小灰灰搞电子2 天前
Rust Slint实现颜色选择器源码分享
开发语言·后端·rust
Source.Liu2 天前
【Chrono库】Unix-like 系统时区处理实现(src/offset/local/unix.rs)
rust·time