1 变量和可变性

1.1 变量

  • 用let定义变量,通常使用自动类型推导,也可以变量名后加冒号和类型来指定类型
  • 默认是不可变的,可以用mut指定是可变的
  • 对不可变变量重新赋值会出现编译错误
  • 可重复使用let定义同名变量,这就是 变量遮盖(shadow) ,遮盖时可修改变量类型

    1.2 常量

  • 使用const定义常量

  • 常量名称通常由大写字母和下划线组成,若不遵照此规范,编译时会出警告

    2 数据类型

    2.1 标量

  • 整数类型
    ints.png

  • 整数类型字面量:默认为i32类型
    int-literal.png
  • 浮点数
    • 有f32和f64两种类型
    • 字面量默认为f64类型
  • 数学运算符:加(+)、减(-)、乘(*)、除(/)、求余(%)
  • 布尔型bool的值有true和false
  • 字符类型char表示一个Unicode编码点

    2.2 复合类型

    2.2.1 元组

    1. fn tuple_demo(){
    2. // 元组的各个元素可以是不同类型,元组解构,用.index引用元组元素
    3. let tup = (3,4.0,"5");
    4. let (x,y,z) = tup;
    5. println!("x={} y={} z={}",x,y,z);
    6. println!("x={} y={} z={}",tup.0,tup.1,tup.2);
    7. }

    2.2.2 数组

    1. fn array_demo(){
    2. let array = [1,2,3,4,5];
    3. let first = array[0];
    4. println!("first={}",first);
    5. }

    3 函数如何工作

  • 表达式与语句:通常语句以分号结束,而表达式末尾不能加分号,加了就是语句了。

  • 函数体中最后一个表达式的值就是函数的返回值,个人建议还是明确地用return来返回值比较好。

    4 控制流

    4.1 if语句

  • if … else

  • let if .. else .. 注意:if和else分值的值类型必须相同```rust let condition = true; let number = if condition {
    1. 5
    } else {
    1. 6
    }; ```

4.2 循环

  • loop 无限循环
  • while 循环
  • for 循环```rust let a = [10, 20, 30, 40, 50];

    for element in a.iter() {

    1. println!("the value is: {}", element);

    }

    1. ```rust
    2. for number in (1..4).rev() {
    3. println!("{}!", number);
    4. }

5 源代码```rust

fn main() {

  1. // 常量应该命名为大写字母串(不是大写字母串时会警告)
  2. const A:u32 = 0;
  3. // 变量遮盖(shadow)不同于变量赋值.变量默认是不可变(immutable)的
  4. // 1 只有明确地用mut才能指示是可变的(mutable)
  5. // 2 使用let表示变量遮盖,创建了同名变量;不使用let则是赋值,这对于不可变变量是非法的
  6. // 3 变量遮盖时实际创建了新的变量,所以可以改变类型
  7. let x = 5;
  8. let x:i64 = x + 6;
  9. let spaces = " ";
  10. let spaces = spaces.len();
  11. // 这是错误的: 没有let则是变量赋值,而不是遮盖
  12. // 赋值时不可改变类型;遮盖时可改变类型
  13. //spaces = spaces.len();
  14. println!("A={} x={} spaces={}",A,x,spaces);
  15. array_demo();
  16. tuple_demo();
  17. for_demo();
  18. println!("3 + 4 = {}",add_two(3,4));
  19. println!("month_days(2017,6)={}",month_days(2017,6));

}

fn array_demo(){ let array = [1,2,3,4,5]; let first = array[0]; println!(“first={}”,first); }

fn tuple_demo(){ // 元组的各个元素可以是不同类型,元组解构,用.index引用元组元素 let tup = (3,4.0,”5”); let (x,y,z) = tup; println!(“x={} y={} z={}”,x,y,z); println!(“x={} y={} z={}”,tup.0,tup.1,tup.2); }

fn add_two(a:i32,b:i32)->i32{ // 注意: 末尾不能有分号. // 有分号是语句;没有分号是表达式;函数末尾应该是一个表达式,而不是语句. a+b }

fn month_days(year:i32,month:i32)->i32{ // if表达式 let days = if month == 2{ if (year % 4 == 0 && year % 100 != 0) || year % 400 == 0{ 29 }else{ 28 } }else{ let array: [i32;13] = [0,31,28,31,30,31,30,31,31,30,31,30,31]; array[month as usize] }; return days; }

fn for_demo(){ // for 循环 let a = [10, 20, 30, 40, 50]; for element in a.iter() { println!(“the value is: {}”, element); }

  1. for number in (1..4).rev() {
  2. println!("{}!", number);
  3. }

} ```