基本类型
语言中的基本数据类型其实也都大差不差,粗略来看,可以简单的分为数值、字符串和布尔型,数值一般用来做运算,字符串用来做展示,布尔用来做逻辑判断。但是具体细分下去又有很多的不同。比方说,有的语言数值就只有一种类型(例如js),有的语言,数值型又会细分成整形、浮点型等。接下来我们详细看下rust中的基本数据类型。
数值型
整型
rust中的数值型大体可以分成两类,一类是整型,一类是浮点型。具体细分下去,整型又可以分为有符号整型和无符号整型。详细的可以看下图:
上图中我们可以看到,整型大体分为两类:有符号整型(signed)和无符号整型(unsigned),之后这两类又根据占用的内存空间大小细分为8位有/无)符号整型、16位(有/无)符号整型等。有符号和无符号的区分就在于有符号整数可以表示负整数,而无符号整数就只能表示正整数。位数的不同,可以声明的整数最大值也不同。如果你把一个变量声明为整型但是给它赋了一个小数,有或者你声明了无符号整型但是给它赋了一个负数,编译器将会抛出异常。 例如:
let a:u8 = -1;
let a:i8 = 1.1
都是不合法的。 无符号整型能表达的整数大小在0 ~ 2n - 1,有符号整型能表达的整数范围则在-(2n - 1) ~ 2n - 1 - 1,n是你所声明的整型类型的位数。这里需要注意,我们在整型类型的图中看到有个类型是isize/usize,这个类型的位数标识和cpu的架构相关,如果运行代码的cpu是32位的,则这就是32位的有/无符号整型,如果是64位的cpu,则表示的是64位的有/无符号整型。
浮点型
我们再讲整型的时候提到了,如果你打算把小数赋值给一个整型变量,编译器会抛出异常,那么我们要怎么声明小数呢?答案就是浮点型。
虽然js中没有明确区分整型和浮点型,但是如果你对js有一定的了解,一定对浮点型也不会陌生。js中有两个方法,一个是parseInt,一个是parseFloat,分别就是把变量转成整型或者浮点型。所以,你调用parseInt的时候你得到是一个整数,而parseFloat的时候得到的是小数。
浮点型相对来说就比较简单一点,只有两种类型:f32
和 f64
。f就是float的首字母。
如果你对js中的小数有一些了解例如:0.1+0.2!==0.3,那么这类问题在rust中一样会遇到。
NaN
在js中我们有个特殊类型NaN,来表示不合法的数字,rust中一样有这个特性。
let a: i8 = 1 / 0;
上面代码中,a就是一个NaN类型,因为1/0显然不是一个合法的数字。
你可以通过
a.is_nan();
来判断一个变量是否是NaN类型。
字符串和字符
在rust中,字符串其实并不属于基本数据类型,但是因为它太常用了,所以我们提前了解下。
声明字符串的方式很简单:
let a = "hello world";
我们就声明了一个字符串a,值是”hello world“。
在js中,我们可以同时用单引号和双引号来表示字符串,但是rust中,你只能用双引号来表示,因为单引号是留给字符的。
很多语言中也都有字符的概念,它是字符串中的最小单元(字符串,顾名思义,就是一串字符)。当一个值它不能再拆分的时候,它就是字符。例如:单个的数字、字母、汉字和标点符号。
字符的声明方式也很简单:
let a = 'a';
就声明了一个字符。
bool型
bool型主要是用来做逻辑判断,值就两个,true|false。这里就不赘述了,不清楚的可以移步搜索引擎。
我的null呢?
对js有了解的同学肯定都知道,js中有null和undefined,分别用来表示一个对象为空或者对象未被赋值。在rust中也有类似的能力,之后它即不叫null,也不叫undefined,它有一个特殊的名字,叫单元类型。
在rust中,单元类型用()表示,()也是单元类型的唯一值。它和null极度相似,但是又有不同,需要再日后的开发中细细体会。如果你需要用到一个map,但是对map的值不关心,只关心key,那么你就可以给这个map对应key的值赋值成nul。
关于绑定
虽然我们在本文中,多次提到了变量赋值,用来表示将一个值赋给某一个变量,例如:
let a:i32 = -3;
就表示把-3赋值给a这个变量。但是在rust中,其实更准确的叫法应该是变量绑定,因为rust有一个叫所有权的概念。关于所有权,我们将会在后面提到,这里只需要大家知道,rust中变量绑定一般就等同于我们在js中的变量赋值。
作为强类型语言,rust的变量类型比js更丰富,但是对比其他强类型语言其实也没有太大区别。区别比较大的就是单元类型,大家记住就行了。另外,如果对整型还有不清楚的,可以通过搜索引擎更多的了解一些整型的相关知识,例如:为什么无符号整数的最大值比有符号整数要大。这些涉及到计算机的基础知识,就不展开一一赘述了。