【Rust 基础入门】(01) | 变量

  • 0xE
  • 更新于 6天前
  • 阅读 436

本文介绍了 Rust 中变量的可变性和不可变性,以及如何通过解构从元组、数组和结构体中提取值。

在学习 Solana 合约之前,我们先学习 Rust 基础。

此外,文章中的示例代码都可以在 Rust Playground 中运行。

变量可变性

1. 变量可变性是什么?

在 Rust 中,变量的可变性其实就是问一个问题:这个变量的值能不能改?

  • 如果能改,就叫可变变量。
  • 如果不能改,就叫不可变变量。

听起来很简单,但 Rust 在这件事上有点特别:默认情况下,变量是不可变的。也就是说,如果你不特意说明,Rust 会认为这个变量的值从一开始就定好了,以后谁也别想改!

2. 为什么要有不可变变量?

你可能会问:“变量不就是用来变的吗?为啥还要搞个不可变的?”

其实,不可变变量有很多好处:

  • 安全性:不用担心值被意外修改,避免一些隐藏的 bug。
  • 性能优化:编译器知道这个值不会变,可以直接优化代码,运行得更快。
  • 多线程友好:不可变变量天生适合多线程,因为大家都只能读,不会出现“抢着改”的情况。

举个例子:
假设你有一个变量叫 id,表示用户的身份证号。这个值一旦生成就不会变,所以用不可变变量就很合适。
但如果是一个变量叫 age,表示用户的年龄,那每年都要变一次,这时候就得用可变变量了。

3. 可变 vs 不可变:代码示例

我们用一个简单的场景:记录一个人的身份证号和年龄。

fn main() {
    // 不可变变量:名字
    let name = "Alice";
    println!("名字: {}", name); // 输出: 名字: Alice

    // 尝试修改名字(会报错)
    // name = "Bob"; // 取消注释会报错:cannot assign twice to immutable variable

    // 可变变量:年龄
    let mut age = 25;
    println!("年龄: {}", age); // 输出: 年龄: 25

    // 修改年龄
    age = 26;
    println!("过了一年,年龄: {}", age); // 输出: 过了一年,年龄: 26
}

变量解构

1. 什么是变量解构?

变量解构是一种从复杂数据结构(比如元组、数组、结构体等)中提取值,并将这些值分配给单独变量的方式。简单来说,就是把一个“打包”好的数据拆开,取出你需要的部分。

举个例子:
假设你有一份快递包裹,里面有一部手机、一根充电线和一副耳机。你可以用变量解构把这些物品分别取出,放到不同的位置,甚至可以只拿你需要的手机和耳机,而忽略掉充电线。

2. 变量解构的代码示例

示例 1:元组解构

元组是一个包含多个不同类型值的数据结构。我们可以用解构把元组中的值提取出来。

fn main() {
    // 定义一个元组,表示一个快递包裹
    let package = ("手机", "充电线", "耳机");

    // 解构元组,把值分别赋给不同的变量
    let (phone, cable, earphones) = package;

    println!("收到的物品: 手机: {}, 充电线: {}, 耳机: {}", phone, cable, earphones);
    // 输出: 收到的物品: 手机: 手机, 充电线: 充电线, 耳机: 耳机

    // 如果你只想要手机和耳机,可以忽略充电线:
    let (phone, _, earphones) = package;
    println!("我只拿需要的: 手机: {}, 耳机: {}", phone, earphones);
    // 输出: 我只拿需要的: 手机: 手机, 耳机: 耳机
}

示例 2:数组解构

数组是一个包含多个相同类型值的数据结构。我们也可以用解构来提取数组中的值。

fn main() {
    // 定义一个数组
    let numbers = [1, 2, 3, 4, 5];

    // 解构数组,提取第一个和倒数第二个值
    let [first, .., second_last, _] = numbers;

    println!("第一个数: {}, 倒数第二个数: {}", first, second_last);
    // 输出: 第一个数: 1, 倒数第二个数: 4
}
  • .. 表示忽略中间的所有值。
  • _ 表示忽略某个具体的值。

示例 3:结构体解构

结构体是一种自定义的数据类型,可以包含多个不同类型的字段。我们可以用解构来提取结构体中的字段。

// 定义一个结构体
struct Package {
    tracking_id: i32,
    destination: String,
}

fn main() {
    // 创建一个结构体实例
    let parcel = Package {
        tracking_id: 1001,
        destination: "Beijing".to_string(),
    };

    // 解构结构体,提取 tracking_id 和 destination
    let Package { tracking_id, destination } = parcel;

    println!("快递单号: {}, 目的地: {}", tracking_id, destination);
    // 输出: 快递单号: 1001, 目的地: Beijing
}
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
0xE
0xE
0x59f6...a17e
17年进入币圈,Web3 开发者。刨根问底探链上真相,品味坎坷悟 Web3 人生。工作机会可加v:__0xE__