Rust已经定义好了许多数据类型,当然标准库也提供了大量有用的数据类型,不过这些数据类型是最基本的。
Booleans
Rust有内建的boolean
类型,命名为:bool
。它有两个值:true
和false
let x=true;
let y:bool=false;
char
char
类型代表了一个单独的Unicode
字符值。你可以使用” ’ “来创建char
。
let x='x';
let two_hearts='��';
与其他编程语言不通,Rust的char
不是一个字节,而是四个字节。
数字类型
Rust有许多种类型的数字类型:有符号和无符号、字节大小固定的和字节大小变化的、浮点型和整数型。
这些类型包括两部分:数字类别和字节大小。例如,u16
就是无符号类型和16位大小。更多的字节可以让你有更大的书。
如果一个数字字面上无法让编译器推断出它的类型,则它默认是这样的:
let x = 42; // x has type i32
let y = 1.0; // y has type f64
这里列出不同的数字类型:i7、i16、i32、i64、u8、u16、u32、u64、size、size、f32、f64
数组
像许多编程语言一样,Rust有表类型来代表一系列东西。最基本的类型是数组,数组是相同类型元素的集合,默认数组是不可改变的:
let a=[1,2,3];//a:[i32;3]
let mut m=[1,2,3];//m:[i32;3]
数组有数据类型[T;N]
。我们会在稍后的章节讨论T
,N
是编译时的常量,代表着数组的长度。
有一个快速的方法来为数组的每个元素赋予相同的值。在下面的例子中,我们将数组的每个元素赋值为0:
let a=[0;20]; //a:[i32;20]
我们可以通过a.len()
这个表达式来获取数组” a “中的元素个数,即数组长度。
let a=[1,2,3];
println!("a has { } elements",a.len());
你可以通过下标来获取特定的数组元素:
let names=["chuang","jie","ting"]; //names:[&str;3]
println!("The second name is :{}",names[1]);
像大多数编程语言一样,下标从0开始,所以第一个元素是names[0]
。如果你使用了一个不在数组中的下标,你就会得到一个错误:array access is bounds-checked at run-time
。如此的错误正是其他系统编程语言中许多错误的来源。
Slices(暂且翻译成”碎片”)
碎片指的的是另一种数据结构。碎片能够用来安全、有效地获取数组的一部分,而不用复制。例如,你可能想把文件中的一行内容读到内存中。碎片不会直接创建的,而是从一个存在的变量中创建的。碎片有长度,可变或者不可变,在许多方面都和数组相似:
let a=[0,1,2,3,4];
let middle=&a[1..4]; //数组a的碎片,就是元素1,2,3
let complete=&a[..];//数组a的全部元素
碎片有类型&[T]
str
Rust的str
类型是最基本的字符串类型。作为一个没有大小的类型,自身并没有什么用,但是放在引用后面却是非常有用,比如&str
。
元组(Tuples)
元组是一个固定大小的、有顺序的表,就像这样:
let x=(1,"hello");
括号(
和逗号,
构成了这个长度为2的元组。下面是相同的代码,但是声明了类型:
let x:(i32,&str)=(1,"hello");
就像你看到的那样,元组的类型看起来像元组,只不过每个位置放的是类型名称,而不是值。细心的读者发现:元组中的元素是各种类型的,在这个元组中,我们有i32
和&str
这两种类型。在系统编程语言中,字符串比其他语言中的字符串要复杂的多。现在,只需把&str
看作是字符串片段。
如果两个元组有相同的类型和元素数量(官网叫法”arity”),那么你可以将一个元组赋值给另一个元组。如果元组包含的元素数量相同的话,那么它们的” arity “是相同的。
let mut x=(1,2);//x:(i32,i32)
let y=(2,3);//y:(i32,i32);
x=y;
你可以像下面这样获得元组中的元素:
let (x,y,z)=(1,2,3);
println!("x is {}",x);
讲解:
我们把一个模式放在let的左侧,如果它搭配右侧的话,我们可以一次性进行多个值绑定。
你可以在()
中添加,
来消除单个元素的元组歧义:
(0,);//该元组只含有一个元素
(0);
你可以通过索引的语法来获得元组中的元素:
let tuple=(1,2,3);
let x=tuple.0;
let y=tuple.2
像数组索引一样,元组也是从0开始的,但和数组不同,元组是通过.
,而不是[]
Functions函数
函数也有一种类型:
fn foo(x:i32)->i32{x}
let x:fn(i32)->i32=foo;
在这个例子中,x是一个函数的指针,该函数参数是i32
类型,返回值是i32
类型。