Rust基础知识

随着 Rust 语言的大火,前端圈里掀起了一股 Rust 风 —— 一切能用 Rust 实现的都在尝试使用 Rust 重写,比如最近很火的对标 Babel 的 JavaScript/TypeScript 编译器 swc,相信很多人都已经尝试过了。

对于我们前端来说,这么火的语言,当然不能放过了,必须跟上时代的潮流。

一、什么是 Rust

Rust 是由 Mozilla 主导开发的通用、编译型编程语言。设计准则为 “安全、并发、实用”,支持函数式、并发式、过程式以及面向对象的程序设计风格。     —— 维基百科

二、语言特点

1、语言特点

Rust 在深层语法上跟元语言家族的语言像是 Haskell 更接近。基本上一个函数体的每个部分都是表达式,甚至是控制流操作符。

2、内存安全

在安全代码里不允许空指针,悬垂指针和数据竞争。数值只能用一系列固定形式来初始化,要求所有输入已经被初始化。

3、内存管理

不使用自动垃圾回收系统,通过 RAII 来管理内存和资源,还可选引用计数。

4、所有权

所有的值都有一个唯一的属主,值的有效范围跟属主的有效范围一样。

5、类型多态

Rust的类型系统支持一种类似类型类的机制,叫“traits”,是被Haskell激发灵感的。这是一种用于特定同质法的设施,通过给类型变量声明添加约束来实现。其它来自Haskell的特性,如更高类型多态还没有支持,具体可查看:Rust 类型多态。

三、数据类型

Rust 总共有以下几种类型:整数型、浮点型、布尔型、字符型、复合类型。

1、整数型 (i、u)

Rust 语言的类型类似于 C 系列的语言,整形数据会根据是否有符号分为有符号和无符号类型。

位数
有符号
无符号

8-bit

i8
u8
16-bit
i16
u16
32-bit
i32
u32
64-bit
i64
u64
128-bit
i128u128
...
...
...

整形默认类型是 i32。(i、 u 表示的是 int、uint)

let a = 10; // i32
let b: i64 = 20; // i64

2、浮点型(f)

Rust 与其它语言一样支持 32 位浮点数(f32)和 64 位浮点数(f64)。默认情况下,浮点型数据类型是 64 位浮点数,因为现代计算机处理器对两种浮点数计算的速度几乎相同,但 64 位浮点数精度更高。

let a = 10.0; // f64
let b: f32 = 20.0; // f32

3、布尔型 (bool)

与 js 一样,值为 true 或 false。

4、字符型 (char)

字符类型大小为 4 个字节,代表 Unicode 标量值。

注意:由于中文文字编码有两种(GBK 和 UTF-8),所以编程中使用中文字符串有可能导致乱码的出现,这是因为源程序与命令行的文字编码不一致,所以在 Rust 中字符串和字符都必须使用 UTF-8 编码,否则编译器会报错。

let c = 'a';

5、复合类型

数组想必大家都很熟了,就是由中括号包括的一组相同类型的数据,但是我们需要知道的是,Rust 中的数组是固定长度的,也就是说我们不能在确定一个数组后再去进行新增或删除的操作。

let arr = [1, 2, 3, 4, 5];
let arr2: [i32; 5] = [1, 2, 3, 4, 5]; // 长度为5的i32数组
let arr3 = [1; 3]; // 等于[1, 1, 1]

let one = arr[0]; // 1

Rust 还有一个元组类型,它可以包含不同的数据类型。

let tup: (i32, f32, char) = (10, 20.0, 'a');

四、结构体

结构体有点类似我们 ts 中的 interface

struct Person {
    name: String,
    sex: String,
    age: u32
}

let p1 = Person {
    name: String::from("abc"),
    sex: String::from("male"),
    age:18
}

// 结构体更新语法,类似js的解构
let p2 = Person{
    name: String::from("123"),
    ..p1
}

五、枚举类

enum Phone {
    IPhone, Huawei
}

枚举类常常与 match 语法一起使用,用来实现分支结构,类似其他语法中的 switch,但是 Rust 中并不支持 switch。

fn main() {
enum Phone {
    IPhone(u32),
    Huawei {url: String},
}
let phone = Phone::IPhone(123);
let phone2 = Phone::Huawei {url: String::from("hahaha")};

match phone {
    Phone::IPhone(i) => {
        println!("{}", i);
    },
    Phone::Huawei { url } => {
        println!("{}", url);
    }
}

match phone2 {
    Phone::IPhone(i) => {
        println!("{}", i);
    },
    Phone::Huawei { url } => {
        println!("{}", url);
    }
}
}

// 123
// hahaha

match 除了能够对枚举类进行分支选择以外,还可以对整数、浮点数、字符和字符串切片引用(&str)类型的数据进行分支选择。

对非枚举类进行分支选择时必须处理例外情况,用下划线 _ 表示。

六、所有权

所有权是 Rust 语言为高效使用内存而设计的语法机制

所有权概念是为了让 Rust 在编译阶段更有效地分析内存资源的有用性以实现内存管理而诞生的概念。

// 移动
// 这种情况下无法访问第一个变量
let s1 = String::from("hello");
let s2 = s1; 
println!("{}, world!", s1); // 错误!s1 已经失效


// 克隆
// 这种可以
let s1 = String::from("hello");
let s2 = s1.clone();
println!("s1 = {}, s2 = {}", s1, s2);

- END -

关于奇舞团

奇舞团是 360 集团最大的大前端团队,代表集团参与 W3C 和 ECMA 会员(TC39)工作。奇舞团非常重视人才培养,有工程师、讲师、翻译官、业务接口人、团队 Leader 等多种发展方向供员工选择,并辅以提供相应的技术力、专业力、通用力、领导力等培训课程。奇舞团以开放和求贤的心态欢迎各种优秀人才关注和加入奇舞团。

7c9d580f0cf59a27c00c49642028256a.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值