类型
标量类型(scalar type)
- 有符号整型(signed integers):
i8
、i16
、i32
、i64
和isize
(指针宽度) - 无符号整型(unsigned integers):
u8
、u16
、u32
、u64
和usize
(指针宽度) - 浮点类型(floating point):
f32
、f64
char
(字符):单个 Unicode 字符,如'a'
,'α'
和'∞'
(每个都是 4 字节)bool
(布尔型):只能是true
或false
- 单元类型(unit type):
()
。其唯一可能的值就是()
这个空元组复合类型(compound type)
数组(array):如[1, 2, 3]
元组(tuple):如(1, true)
数字还可以通过后缀 (suffix)或默认方式来声明类型。整型默认为 i32
类型,浮点型默认为 f64
类型。没有指定类型,或者无法推断时使用默认类型。
let an_integer = 5i32; // 后缀说明
// 可以用掩蔽(shadow)来覆盖前面的变量。
let an_integer = 666u32;
字面量和运算符
整数 1
、浮点数 1.2
、字符 'a'
、字符串 "abc"
、布尔值 true
和单元类型 ()
可以用数字、文字或符号之类的 “字面量”(literal)来表示。
通过加前缀 0x
、0o
、0b
,数字可以用十六进制、八进制或二进制记法表示。
fn main() {
// 短路求值的布尔逻辑
println!("true AND false is {}", true && false);
println!("true OR false is {}", true || false);
println!("NOT true is {}", !true);
// 位运算
println!("0011 AND 0101 is {:05b}", 0b0011u32 & 0b0101);
println!("0011 OR 0101 is {:04b}", 0b0011u32 | 0b0101);
println!("0011 XOR 0101 is {:04b}", 0b0011u32 ^ 0b0101); //0011 XOR 0101 is 0110
println!("1 << 5 is {}", 1u32 << 5);
println!("0x80 >> 2 is 0x{:x}", 0x80u32 >> 2);
// 使用下划线改善数字的可读性!
println!("One million is written as {}", 1_000_000u32);
}
元组
元组是一个可以包含各种类型的值的组合。
// 元组可以充当函数的参数和返回值
fn reverse(pair: (i32, bool)) -> (bool, i32) {
// 可以使用 `let` 把一个元组的成员绑定到一些变量
let (integer, boolean) = pair;
(boolean, integer)
}
fn main() {
// 创建单元素元组需要一个额外的逗号,这是为了和被括号包含的字面量作区分。
println!("one element tuple: {:?}", (5u32,));
println!("just an integer: {:?}", (5u32));
// 元组可以被解构(deconstruct),从而将值绑定给变量
let tuple = (1, "hello", 4.5, true);
let (a, b, c, d) = tuple;
println!("{:?}, {:?}, {:?}, {:?}", a, b, c, d);
}
数组和切片
数组(array)是一组拥有相同类型 T
的对象的集合,在内存中是连续存储的。数组的类型标记为 [T; size]。
切片(slice)类型和数组类似,但其大小在编译时是不确定的。slice 的类型标记为 &[T]
。
use std::mem;
fn main() {
// 定长数组(类型标记是多余的)
let xs: [i32; 5] = [1, 2, 3, 4, 5];
// 所有元素可以初始化成相同的值
let ys: [i32; 500] = [0; 500];
// 数组是在栈中分配的
println!("array occupies {} bytes", mem::size_of_val(&xs));
// 数组可以自动被借用成为 slice
println!("borrow the whole array as a slice");
analyze_slice(&xs);
// slice 可以指向数组的一部分
println!("borrow a section of the array as a slice");
analyze_slice(&ys[1 .. 4]);
}