rust编程-通用编程概念(chapter 3.1)

目录

1. 变量和可变(可修改)性


本章节介绍编程语言中一些通用的,rust中也存在的概念。例如:变量、基础类型、函数、注释、控制流 。这些是Rust语言的基石。

像其他编程语言一样,Rust同样包含一组预留的关键词集合。定义变量或函数名时不能使用这些预留关键词。一部分关键词是已定义包含特殊语义的token,另一部分是预留以后使用的。

1. 变量和可变(可修改)性

默认定义中,变量是不可变的。 这个是Rust与其它编程语言极大的区别之一,该特性使得rust在安全性和并发编程中具有优势。但仍然可以通过使用mut 关键词使变量可修改。

变量不可变,意味着不能改变该变量的值。如下代码,通过cargo new varibales创建的rust工程。

// src/main.rs
fn main() {
    let x = 5;
    println!("The value of x is: {}", x);
    x = 6;
    println!("The value of x is: {}", x);
}

cargo构建会报编译错误,如下:

# cargo build
   Compiling variables v0.1.0 (/doc/jiangxiaoqing/rust/chapter3/variables)
error[E0384]: cannot assign twice to immutable variable `x`
 --> src/main.rs:5:5
  |
3 |     let x = 5;
  |         -
  |         |
  |         first assignment to `x`
  |         help: consider making this binding mutable: `mut x`
4 |     println!("The value of x is: {}", x);
5 |     x = 6;
  |     ^^^^^ cannot assign twice to immutable variable

For more information about this error, try `rustc --explain E0384`.
error: could not compile `variables` due to previous error

无法对不可变变量x进行二次赋值操作。

Rust编程语言设计思想认为:应该区分不可变和可变变量,从而减少运行时不同代码或线程误操作修改变量而引起bug的发生。这种bug通常是难以追踪和定位的,因此Rust在编译时即可做到检查此种类型的不安全操作。

Rust编译器确保对不可变变量声明后,该变量不会发生值变更。(如何做到?编译期间记录并追踪每一个变量符号的不可变性以及修改操作?)

通过将变量声明成mut的可变类型,可以使得变量可变,可变变量意义重大。指定mut实际提示变量的读写方,其它的代码可能会随时改变变量的值。

fn main() {
    // let x = 5;
    let mut x = 5;
    println!("The value of x is: {}", x);
    x = 6;
    println!("The value of x is: {}", x);
}

不可变变量的设计和使用除了要考虑了“容易引入bug”的问题,也考虑了其它方面的折中。使用大型数据结构的情况下,就地更改实例可能比复制和返回新分配的实例更快,不宜使用不可变类型;对于更小的数据结构,直接创建新的变量实例,以函数式的编程风格更容易被接受,获得这种清晰性比起降低些许性能的代价是值得的。

  • const定义的常量

常量和不可变变量有区别:

1)常量不能用mut修饰,永不可变

2)用const而非用let来定义常量

3)常量类型在定义时必须指定,不能省略

4)常量定义时赋值,且必须是常量表达式

按照rust的惯例,常量名用大写,如下:

const THREE_HOURS_IN_SECONDS:u32 =  60 * 60 * 3;
println!("The const value is: {}", THREE_HOURS_IN_SECONDS);
  • 变量作用域和变量覆盖

如同C++语言,rust变量在也存在{}内作用域变量,此外,相同作用域中同名变量,后者会覆盖前者。

    let y = 5;

    let y = y + 1;

    {
        let y = y * 2;
        println!("The value of y in the inner scope is: {}", y);
    }

    println!("The value of y is: {}", y);
    
    let spaces = "   ";
    // change variable type
    let spaces = spaces.len();

变量覆盖不同于mut可变变量,变量覆盖是定义新变量,且可以更改同名新变量的类型。

整体代码如下:


fn main() {
    // let x = 5;
    let mut x = 5;
    println!("The value of x is: {}", x);
    x = 6;
    println!("The value of x is: {}", x);
    const THREE_HOURS_IN_SECONDS:u32 =  60 * 60 * 3;
    println!("The const value is: {}", THREE_HOURS_IN_SECONDS);

    let y = 5;
    let y = y + 1;
    {
        let y = y * 2;
        println!("The value of y in the inner scope is: {}", y);
    }
    println!("The value of y is: {}", y);

    let spaces = "   ";
    // change variable type
    let spaces = spaces.len();
    println!("The value of spaces is: {}", spaces);
}

关于作者:

犇叔,浙江大学计算机科学与技术专业,研究生毕业,而立有余。先后在华为、阿里巴巴和字节跳动,从事技术研发工作,资深研发专家。主要研究领域包括虚拟化、分布式技术和存储系统(包括CPU与计算、GPU异构计算、分布式块存储、分布式数据库等领域)、高性能RDMA网络协议和数据中心应用、Linux内核等方向。

专业方向爱好:数学、科学技术应用

关注犇叔,期望为您带来更多科研领域的知识和产业应用。

内容坚持原创,坚持干货有料。坚持长期创作,关注犇叔不迷路

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敩科炼技堂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值