rust abc(4): 定义变量并使用 mut 关键字

在这里插入图片描述

1. 目的

学习 rust 语言中变量的定义方式, 包括普通变量(immutable)、可变变量(mutable)。

本篇博客不涉及引用类型。

2. 不可变变量 (immutable variable)

2.1 含义

rust 语言中定义的变量, 默认是 immutable 类型。啥意思呢?

let a = 1;
let b:i32 = 42;

这样定义的都是 immutable 变量。immutable 指的是取值不能改变。其实可以理解为 C/C++ 中的 const 修饰。 意味着只能在定义时赋值, 定义之外的地方不能修改值,修改就会导致编译报错。

也就是说, 在 rust 语言中, 如下两种定义变量的方式,默认带有 const 属性:

  • let 变量名 = 值; 相当于 C/C++ 的 const auto 变量名 = 值;
  • let 变量名:类型 = 值; 相当于 C/C++ 的 const 类型 变量名 = 值;

2.2 代码实例

d1.rs:

fn main() {
    let a = 1;
    println!("a {}", a);
    a = 2;
    println!("a {}", a);
}

编译运行,的确看到编译报错

zz@Legion-R7000P% rustc d1.rs 
error[E0384]: cannot assign twice to immutable variable `a`
 --> d1.rs:4:5
  |
2 |     let a = 1;
  |         -
  |         |
  |         first assignment to `a`
  |         help: consider making this binding mutable: `mut a`
3 |     println!("a {}", a);
4 |     a = 2;
  |     ^^^^^ cannot assign twice to immutable variable

error: aborting due to previous error

For more information about this error, try `rustc --explain E0384`.

3. 可变变量 (mutable variable)

3.1 含义

所谓可变变量, 就是和前面提到的不可变变量相相反的一种情况: 定义时赋值, 然后定义之外的语句中可以修改值(不过数据类型不能改变)。

具体到代码层面, rust 语言提供了关键字 mut. 有两种用法:

  • let mut 变量名 = 值; 相当于 C/C++ 的 auto var = value;
  • let mut 变量名:类型 = 值; 相当于 C/C++ 的 T var = value;

3.2 代码实例

d2.rs

fn main() {
    let mut a = 1;
    println!("a {}", a);
    a = 2;
    println!("a {}", a);
}

编译运行:

zz@Legion-R7000P% rustc d2.rs
zz@Legion-R7000P% ./d2 
a 1
a 2

4. 总结

Rust 的变量定义, 不考虑引用类型的情况下,其实也不复杂,只有这4种情况。对照 C/C++ 写法, 很容易理解。 只不过需要明确的是, rust 变量默认是 immutable 的,相当于 const 的。受到这种影响的话, 其实写 C/C++ 时,也可以每次都加上 const, 避免不必要的修改,在编译器就可以捕获问题。

rust 语法c/c++ 语法
let 变量名 = 值;const auto 变量名 = 值;
let 变量名:类型 = 值;const 类型 变量名 = 值;
let mut 变量名 = 值;auto var = value;
let mut 变量名:类型 = 值;T var = value;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Rust的std::future是一种表示异步操作结果的类型,它可以在不阻塞线程的情况下等待异步操作完成,并返回结果。下面是使用std::future的基本步骤: 1. 导入future模块:在代码文件的开头添加“use std::future::Future;”语句。 2. 创建异步任务:创建一个异步任务,例如使用async语法创建一个异步函数,返回值类型为Future。 3. 等待异步任务:使用await关键字等待异步任务完成,并获取结果。 下面是一个简单的例子: ```rust use std::future::Future; async fn async_task() -> i32 { 1 + 2 } fn main() { let future = async_task(); // 创建异步任务 let result = futures::executor::block_on(future); // 等待异步任务完成 println!("Result: {}", result); // 打印结果 } ``` 在这个例子中,我们创建了一个异步函数async_task(),返回一个Future,表示一个异步操作。在main函数中,我们调用async_task()创建一个异步任务,并使用futures::executor::block_on()函数等待异步任务完成,并获取结果。最后打印结果。 需要注意的是,使用block_on函数会阻塞当前线程,直到异步任务完成。为了避免阻塞线程,可以使用异步运行时(async runtime)来执行异步任务。Rust提供了多个异步运行时库,例如tokio、async-std、smol等。下面是使用tokio库的例子: ```rust use std::future::Future; use tokio::runtime::Runtime; async fn async_task() -> i32 { 1 + 2 } fn main() { let future = async_task(); // 创建异步任务 let mut rt = Runtime::new().unwrap(); // 创建异步运行时 let result = rt.block_on(future); // 在异步运行时中执行异步任务 println!("Result: {}", result); // 打印结果 } ``` 在这个例子中,我们使用tokio库创建了一个异步运行时,并使用run_until_complete()函数在异步运行时中执行异步任务。这样可以避免阻塞线程,提高程序性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值