自学rust笔记 (1)

134 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情

主要是面对有一定编程基础的读者,相信也没有人会直接用 rust 作为第一种语言学习编程。

通过例子快速掌握 rust 的特点

数据类型

标量类型

整形

就是java的int 但是分类更多

长度有符号无符号
8-biti8u8
16-biti16u16
32-biti32u32
64-biti64u64
128-biti128u128
archisizeusize

有符号就是 -(2n - 1) 到 2n - 1 - 1 无符号是 从 0 到 2n - 1

rust 默认整数是i32 isize 或 usize 主要作为某些集合的索引。

需要注意 整型溢出 编译环境溢出会包panic,正式包会溢出使用wrapping处理溢出

  • 所有模式下都可以使用 wrapping_* 方法进行包装,如 wrapping_add
  • 如果 check_* 方法出现溢出,则返回 None
  • 用 overflowing_* 方法返回值和一个布尔值,表示是否出现溢出
  • 用 saturating_* 方法在值的最小值或最大值处进行饱和处理

浮点型

浮点类型只有f32,f64 都是带符号的,默认为f64

布尔

bool 就是true ,false 更java一样

符号类型

fn main() { 
  let c = 'z'; 
  let z = 'ℤ'; 
  let heart_eyed_cat = '😻'; 
 }

单引号声明,代表unicode 标量值

复合类型

元组

fn main() { 
  let tup: (i32, f64, u8) = (500, 6.4, 1); 
  let five_hundred = x.0;
  let six_point_four = x.1;
  let one = x.2;
  let (x, y, z) = tup; 
  println!("The value of y is: {}", y);
  }

数组类型

fn main() { 
//下面两种方式相同
  let a = [3, 3, 3, 3, 3];
  let a = [3; 5];
  
  let a = [1, 2, 3, 4, 5]; 
  let first = a[0]; 
  let second = a[1]; 
  }

定义变量和常量

let 定义变量,默认是不可变变量,let不返回值不能再次赋值

let 默认是可以推断类型的,但是结果不能推断的时候需要制定类型

let guess: u32 = "42".parse().expect("Not a number!");

mut 可变变量

const 常量

fn main(){
  let x = 5;
  println!("The value of x is: {}", x);
  x = 6;//会编译失败
  println!("The value of x is: {}", x);
}

fn main() { 
  let mut x = 5; 
  println!("The value of x is: {}", x); 
  x = 6; 
  println!("The value of x is: {}", x); 
 }

let 定义的变量是不可以改变的,如果需要改变要设置 mut 变量才能真正的改变

shadowing 隐藏其实就是新建一个变量只不过和java不同的是允许变量名跟之前的相同

fn main() { 
  let x = 5; 
  let x = x + 1; 
  { 
    let x = x * 2; 
    println!("The value of x in the inner scope is: {}", x); 
  } 
  println!("The value of x is: {}", x); 
 }
 
 The value of x in the inner scope is: 12 
 The value of x is: 6

定义方法

方法可以直接返回值,x+1没有写;这样可以直接放回

fn main() { 
  let x = plus_one(5); 
  println!("The value of x is: {}", x); 
 } 
 fn plus_one(x: i32) -> i32 {
   x + 1
 }

流程控制

if

  • if 不会讲其他类型值转成bool判断,所以条件必须是bool型
  • 条件不需要小括号
  • if 是表达式拥有返回值所以可以复制给let
  • 返回值需要统一类型
fn main() { 
  let condition = true; 
  let number = if condition { 5 } else { "six" }; println!("The value of number is: {}", number); 
  }

循环

  • 支持 while,for
  • 增加loop 无限循环
  • break,continue 默认结束当前层循环,
  • break 可以带返回值,可以赋值
fn main() { 
  let mut counter = 0; 
  let result = loop {
    counter += 1; 
    if counter == 10 {
      break counter * 2; 
      } 
    }; 
    println!("The result is {}", result); }