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


    目录

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


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

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

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

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

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

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

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

    1. # cargo build
    2. Compiling variables v0.1.0 (/doc/jiangxiaoqing/rust/chapter3/variables)
    3. error[E0384]: cannot assign twice to immutable variable `x`
    4. --> src/main.rs:5:5
    5. |
    6. 3 | let x = 5;
    7. | -
    8. | |
    9. | first assignment to `x`
    10. | help: consider making this binding mutable: `mut x`
    11. 4 | println!("The value of x is: {}", x);
    12. 5 | x = 6;
    13. | ^^^^^ cannot assign twice to immutable variable
    14. For more information about this error, try `rustc --explain E0384`.
    15. error: could not compile `variables` due to previous error

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

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

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

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

    1. fn main() {
    2. // let x = 5;
    3. let mut x = 5;
    4. println!("The value of x is: {}", x);
    5. x = 6;
    6. println!("The value of x is: {}", x);
    7. }

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

    • const定义的常量

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

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

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

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

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

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

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

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

    1. let y = 5;
    2. let y = y + 1;
    3. {
    4. let y = y * 2;
    5. println!("The value of y in the inner scope is: {}", y);
    6. }
    7. println!("The value of y is: {}", y);
    8. let spaces = " ";
    9. // change variable type
    10. let spaces = spaces.len();

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

    整体代码如下:

    1. fn main() {
    2. // let x = 5;
    3. let mut x = 5;
    4. println!("The value of x is: {}", x);
    5. x = 6;
    6. println!("The value of x is: {}", x);
    7. const THREE_HOURS_IN_SECONDS:u32 = 60 * 60 * 3;
    8. println!("The const value is: {}", THREE_HOURS_IN_SECONDS);
    9. let y = 5;
    10. let y = y + 1;
    11. {
    12. let y = y * 2;
    13. println!("The value of y in the inner scope is: {}", y);
    14. }
    15. println!("The value of y is: {}", y);
    16. let spaces = " ";
    17. // change variable type
    18. let spaces = spaces.len();
    19. println!("The value of spaces is: {}", spaces);
    20. }

    关于作者:

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

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

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

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

  • 相关阅读:
    Unity实战之一个脚本实现雷达图
    传感器特点汇总
    python中的函数和变量的用法
    后端传递数据给前端做导出Excel的Controller类
    微服务框架 SpringCloud微服务架构 21 RestClient 操作文档 21.5 批量导入文档
    基于Springboot的美容院管理系统(有报告)。Javaee项目,springboot项目。
    HTML List label Ordered list Unodered list Definition list
    码神之路项目总结(四)
    Nginx安装Openresty加载Lua代码
    Redisson 的主要方法
  • 原文地址:https://blog.csdn.net/landy_john/article/details/127956859