0
点赞
收藏
分享

微信扫一扫

Rust (一)变量的可变性

Brose 2022-08-24 阅读 53


Rust (一)变量的可变性_数组

文章目录

  • ​​一、前言​​
  • ​​二、数据类型​​
  • ​​三、变量的可变性​​
  • ​​附一:环境搭建​​
  • ​​附二:Nightly版本安装及版本切换​​

一、前言

Rust是一门系统编程语言专注于安全 ,尤其是并发安全,支持函数式命令式以及泛型等编程范式的多范式语言

标准Rust性能与标准C++性能不相上下,关于性能对比:​​【查看】​​​ 正如​​张汉东​​说的那样,rust语言有如下优点:

  • 系统级语言
  • 无GC 基于RAII(Resource Acquisition Is Initialization)
  • 内存安全 无悬垂指针等
  • 并发安全 所有权系统
  • 混合编程范式

关于rust学习资料:
rust 官网:​​​https://www.rust-lang.org/​​​ rust 官方入门学习资料:​​https://doc.rust-lang.org/book/​​

rust 特性

首先Rust是一门系统及的语言,也就是说速度,在这门语言的设计时是非常重视的。这样语言就不得有垃圾回收机制,也就是无GC,显然在rust之前,只有C/C++,在没有GC的情形下,就得管理内存吧。与C/C++不同的是内存管理不是依靠人,考虑人总有犯错的时候,rust使用(借鉴)现代C++的基于RAII(Resource Acquisition Is Initialization)方式来实现。

C++是默认以复制语义为主的,而Rust默认是移动语义。在特殊情况下也支持复制语义。但是不管是移动还是复制,变量之间不能共享同一份堆上的数据。这样就避免了C++的悬垂指针这样现象。
若是要想共享对象的数据,需要通过引用来借用。但是在Rust中同一作用域内同时只能有一个可变的引用或者多个不变引用共享

还有以下特性:零开销抽象;转移语义;保证内存安全;线程无数据竞争;基于 trait 的泛型;模式匹配;类型推断;极小运行时;等等。

在接下来的章节中,我会将Rust的基础语法概念:变量绑定、原生类型、数组、动态数组、字符串、结构体、枚举、控制流、函数与方法、特性、注释等穿插在语言特性中,不会一一讲解,关于详情查看官方文档。

二、数据类型

Rust内置的原生类型 (primitive types) 有以下:

  • 布尔类型:有两个值true和false。
  • 字符类型:表示单个Unicode字符,存储为4个字节。
  • 数值类型:分为有符号整数 (i8, i16, i32, i64, isize)、 无符号整数 (u8, u16, u32, u64, usize) 以及浮点数 (f32, f64)。
  • 字符串类型:最底层的是不定长类型str,更常用的是字符串切片&str和堆分配字符串String, 其中字符串切片是静态分配的,有固定的大小,并且不可变,而堆分配字符串是可变的。
  • 数组:具有固定大小,并且元素都是同种类型,可表示为[T; N]。
  • 切片:引用一个数组的部分数据并且不需要拷贝,可表示为&[T]。
  • 元组:具有固定大小的有序列表,每个元素都有自己的类型,通过解构或者索引来获得每个元素的值。
  • 指针:最底层的是裸指针const T和mut T,但解引用它们是不安全的,必须放到unsafe块里。
  • 函数:具有函数类型的变量实质上是一个函数指针。
  • 元类型:即(),其唯一的值也是()。

有几点是需要特别注意的:

  • 数值类型可以使用_分隔符来增加可读性。(let a=100_000;)
  • Rust还支持单字节字符b’H’以及单字节字符串b"Hello",仅限制于ASCII字符。 此外,还可以使用r#"…"#标记来表示原始字符串,不需要对特殊字符进行转义。
  • 使用&符号将String类型转换成&str类型很廉价, 但是使用to_string()方法将&str转换到String类型涉及到分配内存, 除非很有必要否则不要这么做。
  • 数组的长度是不可变的,动态的数组称为Vec (vector),可以使用宏vec!创建。
  • 元组可以使用==和!=运算符来判断是否相同。
  • 不多于32个元素的数组和不多于12个元素的元组在值传递时是自动复制的。
  • Rust不提供原生类型之间的隐式转换,只能使用as关键字显式转换。
  • 可以使用type关键字定义某个类型的别名,并且应该采用驼峰命名法。

三、变量的可变性

默认情况下,rust 语言中声明的变量是不可变的

fn main() {
let a1 = 5; //不可变绑定
let a2:i32 = 5; //显性声明数据类型
// a3 = a1 这样会报错,不可变绑定不能再赋值

assert_eq!(a1, a2); //断言是否相等
//let 绑定 整数变量默认类型推断是 i32

let mut a: f64 = 1.0; //使用 mut 关键字声明可变绑定的变量。
}

array 数组
声明并初始化:​​​let variable_name:[dataType;size] = [value1,value2,value3];​​,当然数据类型可推断出来。

fn main(){
let arr0:[i32;4] = [10,20,30,40];
let mut arr1:[i32;4] = [10,20,30,40];
// arr0[1] = 0; //报错,不可变数组无法修改
arr1[1] = 0;
println!("{:?}",arr1);
}

vector

fn main() {
// 有mut关键词,可以动态添加和删除元素
let mut vec1: Vec<u32> = Vec::new();

// 在定义时初始化,没有mut关键词,无法动态添加和删除
let vec2 = vec![1, 2, 3, 4, 5];
let vec3 = vec!["str1", "str2", "str3"];
}

引用

fn main() {
let mut s = String::from("hello");
let r1 = &mut s;
// let r2 = &mut s; // 报错,只允许一个可变引用

let x = 1;
// let y = &mut x; // 报错, 不可变的值,不能可变的引用(借用)它
}

附一:环境搭建

  • 物理机:win10+visual studio 2015​​【下载DOWNLOAD RUSTUP-INIT.EXE (64-BIT)双击安装】​​ (由于我之前安装过VS,故安装顺利)
    配置中科大仓库源:在用户名目录下(​​C:\Users\username\.cargo\​​)新建config文件添加如下内容:

[source.crates-io]
registry = "https://github.com/rust-lang/crates.io-index"
replace-with = 'ustc'
[source.ustc]
registry = "git://mirrors.ustc.edu.cn/crates.io-index"

  • 虚拟机:CentOS
    安装直接执行命令:​​curl https://sh.rustup.rs -sSf | sh​​ 配置中科大源:​​sudo vi /etc/profile​​,添加如下内容:
    ​export RUSTUP_DIST_SERVER=https://mirrors.ustc.edu.cn/rust-static​​(用于更新toolchain)
    ​export RUSTUP_UPDATE_ROOT=https://mirrors.ustc.edu.cn/rust-static/rustup​​(用于更新 rustup)
    配置清华crates源: 创建并编辑​​~/.cargo/config​​ 文件,添加如下内容:

[source.crates-io]
replace-with = 'tuna'

[source.tuna]
registry = "https://mirrors.tuna.tsinghua.edu.cn/git/crates.io-index.git"

  • IDE 工具:pycharm社区版+Rust插件,(别问为什么,问就是写python的)
  • Rust (一)变量的可变性_数组_02

  • 语法高亮与智能提示,完美了。

附二:Nightly版本安装及版本切换

按键:win + r,输入cmd,

执行命令:​​rustup toolchain list​​ 查看当前版本

切换版本:​​rustup default stable/nightly​

Rust (一)变量的可变性_c++_03


举报

相关推荐

0 条评论