let a = (1i32, false); // 元组中包含两个元素,第一个是i32类型,第二个是bool类型 let b = ("a", (1i32, 2i32)); // 元组中包含两个元素,第二个元素本身也是元组,它又包含了两个元素 let a = (0, ); // a是一个元组,它有一个元素 let b = (0); // b是一个括号表达式,它是i32类型
let p = (1i32, 2i32); let (a, b) = p;
let x = p.0; let y = p.1; println!("{} {} {} {}", a, b, x, y);
fn main() { println!("size of i8 {}" , std::mem::size_of::<i8>()); println!("size of char {}" , std::mem::size_of::<char>()); println!("size of '()' {}" , std::mem::size_of::<()>()); }
struct
1 2 3 4
struct Point { x: i32, y: i32, }
初始化,类json语法初始化
1 2 3 4
fn main() { let p = Point { x: 0, y: 0}; println!("Point is at {} {}", p.x, p.y); }
使用局部变量初始化
1 2 3 4 5 6 7 8
fn main() { // 刚好局部变量名字和结构体成员名字一致 let x = 10; let y = 20; // 下面是简略写法,等同于 Point { x: x, y: y },同名字的相对应 let p = Point { x, y }; println!("Point is at {} {}", p.x, p.y); }
fn main() { let x = true; let y: bool = !x; // 取反运算 let z = x && y; // 逻辑与,带短路功能 println!("{}", z); let z = x || y; // 逻辑或,带短路功能 println!("{}", z); let z = x & y; // 按位与,不带短路功能 println!("{}", z); let z = x | y; // 按位或,不带短路功能 println!("{}", z); let z = x ^ y; // 按位异或,不带短路功能 println!("{}", z); }
char
1 2 3 4 5 6 7 8 9 10 11 12 13
unicode 都是4个字节 let love = '❤'; // 可以直接嵌入任何unicode字符 转义符 let c1 = '\n'; // 换行符 let c2 = '\x7f'; // 8 bit字符变量 let c3 = '\u{7FFF}'; // unicode字符
都是1个字节 let x :u8 = 1; let y :u8 = b'A'; let s :&[u8;5] = b"hello"; let r :&[u8;14] = br#"hello \n world"#;
整数类型
i8 u8, i16 u16 … i128, u128, isize, usize
1 2 3 4 5 6 7 8 9
let var1 : i32 = 32; // 十进制表示 let var2 : i32 = 0xFF; // 以0x开头代表十六进制表示 let var3 : i32 = 0o55; // 以0o开头代表八进制表示 let var4 : i32 = 0b1001; // 以0b开头代表二进制表示 let var6 = 123usize; // i6变量是usize类型 let var7 = 0x_ff_u8; // i7变量是u8类型 let var8 = 32; // 不写类型,默认为 i32 类型
let var5 = 0x_1234_ABCD; // 使用下划线分割数字,不影响语义,但是极大地提升了阅读体验。
(pointer size)isize和usize占用字节数和32位或者64位系统有关系
浮点类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14
let f1 = 123.0f64; // type f64 let f2 = 0.1f64; // type f64 let f3 = 0.1f32; // type f32 let f4 = 12E+99_f64; // type f64 科学计数法 let f5 : f64 = 2.; // type f64