写点什么

5 分钟速读之 Rust 权威指南(二)

用户头像
码生笔谈
关注
发布于: 2021 年 05 月 14 日
5分钟速读之Rust权威指南(二)

数据类型

这一节来介绍 rust 的数据类型,在 JS 中有 string、number、boolean、symbol、null、undefined、object,拿 number 类型来说,rust 中包含多种数字类型。另外,如果用过 TS 的话可能会听说过 tuple 元组类型,rust 中也存在元组。

标量类型(scalar)标量就是基础类型,包含整数、浮点数、布尔、字符串


整数,包含 i 和 u 系列


  • 对于 i8 来讲,范围是-2 的 7 次方→2 的七次方减 1,也就是-128→127

  • 对于 u8 来讲,范围是 2 的 8 次方减 1,也就是-128→127

  • 对于 in 来讲,范围就是-2 的(n-1)次方→2 的(n-1)次方减 1

  • 对于 un 来讲,范围就是 2 的 n 次方减 1

  • isize 和 usize:它们的长度取决于程序运行的目标平台。在 64 位架构上,它们就是 64 位的,而在 32 位架构上,它们就是 32 位的。

  • 字面量声明


// rust会自动将类型推断为i32let a = 20;
// 显式声明let b: i32 = 20;
// 字面量方式,在数字后面跟一个类型let c = -20i8;let d = 20u8;
// 可以使用分隔符提升易读性let e = 1_000u16;
// 字面量16进制let f = 0xff;// 255
// 字面量八进制let g = 0o77;// 63
// 字面量二进制let h = 0b111_0000;// 112
// 单个字符的ASCII值,得到一个u8类型let l = b'a'// 97
复制代码


新手入门的话,我们一般使用 i32 就够了,它的运算速度大部分情况也是速度最快的一个。

浮点数 f 系列

  • f32,占用 32 位长度


let a = 0.2f32;
复制代码


  • f64,占用 64 长度


// 默认就是f64,两者等价let a = 0.2;let a2 = 0.2f64;
// rust也使用的IEEE754标准,存在失真问题: 0.1 + 0.2;// 0.30000000000000004
复制代码

布尔 bool

与 JS 一样,只有两个布尔值


// 自动推断let c = true;// 显式注明类型let d: bool = false;
复制代码

字符 char

单个字符(char)使用单引号定义


// 只能是单个字符let e = 'e';
// 多个字符会报错 errorlet e2: char = 'e2';
// 不存在空字符串 errorlet empty: char = '';
// 单个字符可以是emojilet e3 = '🍔';
复制代码


rust 中的 char 类型占 4 字节,是一个 Unicode 标量值,这也意味着它可以表示比 ASCII 多得多的字符内容。


拼音字母、中文、日文、韩文、零长度空白字符,甚至是 emoji 表情都可以作为一个有效的 char 类型值。


实际上,Unicode 标量可以描述从 U+0000 到 U+D7FF 以及从 U+E000 到 U+10FFFF 范围内的所有值。


由于 Unicode 中没有“字符”的概念,所以你现在从直觉上认为的“字符”也许与 rust 中的概念并不相符。


多个字符可以组成一个字符串(str)


// strlet s = "string";
// 显式指定类型 &str,这里的&表示引用,可以先忽略,后面章节会介绍到let s2: &str = "string";
复制代码

复合类型 compound

数组 array

用方括号创建数组,成员类型必须一致,数组长度不可变,动态长度数组可以用 vector 类型(后面章节会有介绍)


// 声明类型同样会自动推断,或使用方括号,将类型与长度用分号分隔开let i: [i32; 3] = [1, 2, 3];
// 不能存在不同的类型,会报错let i2 = [1,2,3, ' ', true];
// 用方括号取值、用len()方法获取长度println!("{}-{}", i[0], i.len())
// 简洁声明:[填充;长度]let m = [2;3];// 相当于let m2 = [2, 2, 2];println!("{}-{}-{}", m[0], m[1], m[2])// 2-2-2
// 访问数组超出范围会报错let n = [1;3]println!("{}", n[3])
// 解构方式取值let [o, p] = n;println!("{}-{}", o, p)
复制代码

元组 tuple

用圆括号来声明元组,如果不指定类型,编译器会自动推断


// 定义元组,分别标注每一个成员的类型let tup2: (i32, char, bool) = (1, 's', true);
// rust也支持自动推断类型let tup = (1, 's', true);
// 通过结构对元组进行取值let (f, g, h) = tup;println!("{}-{}-{}", f, g, h) // 1 s true
// 通过索引来访问println!("{}-{}-{}", tup.0, tup.1, tup.2) // 1 s true
// 元组没有len()方法,调用会报错tup.len()
复制代码


好奇的同学可能会问为什么没有出现 object 类型,也就是 JS 中的对象,事实上 rust 中类似 JS 中对象的东西叫做结构体 struct,由于结构体稍微比较复杂,后面会有单独的章节介绍。

发布于: 2021 年 05 月 14 日阅读数: 16
用户头像

码生笔谈

关注

欢迎关注「码生笔谈」公众号 2018.09.09 加入

前端、Rust干货分享,一起成为更好的Javascripter & Rustacean

评论

发布
暂无评论
5分钟速读之Rust权威指南(二)