本文介绍了 Rust 中变量的可变性和不可变性,以及如何通过解构从元组、数组和结构体中提取值。
在学习 Solana 合约之前,我们先学习 Rust 基础。
此外,文章中的示例代码都可以在 Rust Playground 中运行。
在 Rust 中,变量的可变性其实就是问一个问题:这个变量的值能不能改?
听起来很简单,但 Rust 在这件事上有点特别:默认情况下,变量是不可变的。也就是说,如果你不特意说明,Rust 会认为这个变量的值从一开始就定好了,以后谁也别想改!
你可能会问:“变量不就是用来变的吗?为啥还要搞个不可变的?”
其实,不可变变量有很多好处:
举个例子:
假设你有一个变量叫 id,表示用户的身份证号。这个值一旦生成就不会变,所以用不可变变量就很合适。
但如果是一个变量叫 age,表示用户的年龄,那每年都要变一次,这时候就得用可变变量了。
我们用一个简单的场景:记录一个人的身份证号和年龄。
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
}
变量解构是一种从复杂数据结构(比如元组、数组、结构体等)中提取值,并将这些值分配给单独变量的方式。简单来说,就是把一个“打包”好的数据拆开,取出你需要的部分。
举个例子:
假设你有一份快递包裹,里面有一部手机、一根充电线和一副耳机。你可以用变量解构把这些物品分别取出,放到不同的位置,甚至可以只拿你需要的手机和耳机,而忽略掉充电线。
元组是一个包含多个不同类型值的数据结构。我们可以用解构把元组中的值提取出来。
fn main() {
// 定义一个元组,表示一个快递包裹
let package = ("手机", "充电线", "耳机");
// 解构元组,把值分别赋给不同的变量
let (phone, cable, earphones) = package;
println!("收到的物品: 手机: {}, 充电线: {}, 耳机: {}", phone, cable, earphones);
// 输出: 收到的物品: 手机: 手机, 充电线: 充电线, 耳机: 耳机
// 如果你只想要手机和耳机,可以忽略充电线:
let (phone, _, earphones) = package;
println!("我只拿需要的: 手机: {}, 耳机: {}", phone, earphones);
// 输出: 我只拿需要的: 手机: 手机, 耳机: 耳机
}
数组是一个包含多个相同类型值的数据结构。我们也可以用解构来提取数组中的值。
fn main() {
// 定义一个数组
let numbers = [1, 2, 3, 4, 5];
// 解构数组,提取第一个和倒数第二个值
let [first, .., second_last, _] = numbers;
println!("第一个数: {}, 倒数第二个数: {}", first, second_last);
// 输出: 第一个数: 1, 倒数第二个数: 4
}
..
表示忽略中间的所有值。_
表示忽略某个具体的值。结构体是一种自定义的数据类型,可以包含多个不同类型的字段。我们可以用解构来提取结构体中的字段。
// 定义一个结构体
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
}
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!