【Rust 基础入门】(01) | 变量
在学习 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
}
版权声明
本文仅代表作者观点,不代表区块链技术网立场。
本文系作者授权本站发表,未经许可,不得转载。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。