变量
关键字 | 作用 | 修改 | 重新定义 | 指定类型 |
---|---|---|---|---|
let | 变量 | 不能被修改 | 可以重新定义 | 可以不指定类型 |
const | 常量 | 不能被修改 | 不可以重新定义 | 必须指定类型 |
mut | 关键字 | * | 需要在 let 后添加 | * |
let // 变量 不能被修改 可以重新定义 可以不指定类型 例:
let x = 1;
x = 2; // ×
let x = "1"; // √
const // 常量 不能被修改 不可以重新定义 必须指定类型 例:
const THREE:u8 = 3;
THREE = 5; // ×
const THREE = 3; // ×
const mut THREE:u8 = 3; // ×
mut // 如果要修改 let 变量的值 需要在定义前 添加关键字 例:
let mut x = 1;
x = 2; // √
x = "2" // × 注: 可以修改值但是不可以修改数据类型
数据类型
整型
长度 | 有符号类型 | 无符号类型 |
---|---|---|
8 位 | i8 | u8 |
16 位 | i16 | u16 |
32 位 | i32 | u32 |
64 位 | i64 | u64 |
128 位 | i128 | u128 |
arch | isize | usize |
注:isize 和 usize 类型,若使用 64 位架构系统则为 64 位,若使用 32 位架构系统则为 32 位
整型溢出:假设 u8
可以存 0-255
如果存入的是 256
那么就会变成 0
,257
-->1
,Rust
会进行一种被称为二进制补码包裹(two’s complement wrapping)的操作
整型字面量
数字字面量 | 示例 |
---|---|
十进制 | 98_222 |
十六进制 | 0xff |
八进制 | 0o77 |
二进制 | 0b1111_0000 |
字节 (仅限于 u8) | b'A' |
Rust
的整型默认是 i32
,isize
和 usize
的主要应用场景是用作某些集合的索引
浮点数
Rust
的浮点型是 f32
和 f64
,它们的大小分别为 32
位和 64
位
let x = 2.0; // f64
let y:f32 = 3.0; // f32
布尔类型
let t = true;
let f:bool = false;
字符类型
let x = ' ';
let c = 'z';
let cat = '🐱';
Rust
的字符类型大小为 4 个字节,表示的是一个 Unicode
标量值,这意味着它可以表示的远远不止是 ASCII
。标音字母
,中文/日文/韩文的文字
,emoji
,还有零宽空格(zero width space)
在 Rust
中都是合法的字符类型。Unicode
值的范围为 U+0000 ~ U+D7FF
和 U+E000~U+10FFFF
。
复合类型
复合类型均无法放大缩小 类似于push
等操作
如需增加删除可以使用 vector
(动态数组)
let v: Vec<i32> = Vec::new();
v.push(1)
v.push(-1)
- 元组(tuple)
let tup:(u32,f32,u8) = (10,20.1,399)
// 可以结构
let (x, y, z) = tup;
// 取值用索引
let one = tup.0;
注:()
为特殊的单元值
,如果表达式不返回任何东西,则默认返回单元值
- 数组(Array)
let a = [1, 2, 3, 4, 5]; //每个元素类型必须相同
let b = [3; 5] // 等同于 let b = [3, 3, 3, 3, 3]
let c: [i32; 5] = [1, 2, 3, 4, 5]; // 写在前面就是定义类型
let one = a[0]; // 取值 1
// 索引越界会报错
函数
fn main(){
// body
funcOne(5, 244)
}
fn funcOne(x:i32, y:u8){ // 参数必须定义类型
println!("{}-{}", x, y);
}
// 带有返回值 必须定义返回类型
fn live() -> u32 { // 函数内未被 ; 结尾的会被返回
10
}
let x = live(); // x = 10
赋值
let x = (let y = 6); // × let y = 6 不返回任何值
let x = let y = 6; // ×
块级作用域
let y = {
let x = 3;
x + 1
};
// 其中 x + 1 没有用 ; 结尾
// 相当于将 x + 1 的结果 return出去 赋给了 y
注:此处没有修改 x 的值 只是临时计算了 x + 1 的结果 并赋值给了 y 此时 x 在作用域内 还是 3
流程判断
if
let x = 1;
if x < 2 {
println!("true");
}
if x == 2 {
println!("true");
}else if x == 4 {
println!("4");
}else {
println!("false");
}
let is_number = true;
let y = if is_number { 5 } else { 6 }; // 类似于 三目运算符
let z = if is_number { "number" } else { 6 }; // × 类型必须一致
循环
loop {
println!("123");
}
loop {
println!("123");
break; // 跳出
}
loop {
'loopOne:loop{
println!("123");
break 'loopOne; // 跳出指定循环 注意这里一定是要单引号!
}
break;
}
let mut number = 1;
while number > 0 {
println!("{}",number);
number -= 1;
}
println!("while end");
let a = [1, 2, 3, 4, 5];
for el in a {
println!("{}",el);
}
for i in (1..10) { // 1-10
println!("{}",i)
}
注释
// 为普通类型注释 /// 为文档类型注释 支持 Markdown 语法 , 用来生成 html