文章目录
- 一、前言
- 二、数据类型
- 三、变量的可变性
- 附一:环境搭建
- 附二: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的)
- 语法高亮与智能提示,完美了。
附二:Nightly版本安装及版本切换
按键:win + r,输入cmd,
执行命令:rustup toolchain list
查看当前版本
切换版本:rustup default stable/nightly