rust学习笔记

1.rust里绑定变量是let,默认绑定了的变量是不可更改的,所以如果想让变量可变就要加上mut。

let x = 1; let mut y = 2;

2.match 相当于erlang中的case,但是case的每一项后都是分号,但是rust的match却是逗号。

3.match 的每一项最后都要加逗号,但是最后一项不加也不会报错,所有结尾加逗号的用法都是类似。

4.每个语句结尾都要加分号,但是当函数指定了返回值之后,这个函数的最后一个表达式不能加分号,负责会报错。

5.rust中除了两种声明之外其他的都是表达式。第一种声明是绑定声明:let x = 1;它不是表达式,所以没有返回值,所以不能这么写let x = (let y = 1); ,如果对一个已经绑定了德变量赋值,那么这个赋值的语句就是一个表达式,而不是声明,而所有赋值表达式的值都是空元祖 () = (y = 5);

另一种声明就是表达式声明,凡是以分号结尾的表达式都是表达式声明,所以几乎所有的函数内部的语句都是表达式声明,除了下面这种情况:

fn add_one(x: i32) -> i32 {
    x + 1
}

 函数要求德返回值类型是i32,但是如果在x+1后加分号,那么就是个表达式声明,所有的表达式声明的值都是空元祖,所以返回值就是空元祖,所以与返回值类型不一致,所以报错。

 

6.数字类型里的isize和usize,指的是有符号整数和无符号整数。

 

7.let绑定时,就会对绑定的变量进行类型指定,即便是mut绑定,再次重新绑定的时候,类型也必须是第一次绑定的类型。

let mut x = (1, 2); // x: (i32, i32)
let y = (2, 3); // y: (i32, i32)

x = y; //正确

let z = (2, "3");
x = z; //错误,因为x的类型是(i32, i32) z的类型是 (i32, &str)

 

 8.单个元素的元组是这样写:(0,) 而不是(0).

 

9.rust的基本类型只有: bool, arry, numeric, slice, str, tuple, function,7种

 

10.函数指针 : 

fn foo(x: i32) -> i32 { x }

let x: fn(i32) -> i32 = foo;

 

11. 0..10指的是从0到9,不包括10.

 

12. 对于绑定

let b = a;

 来说rust有两中方式,一种是move一种是copy,当一个绑定a是指针时,为了保证消除数据竞争,同一个内存实例只能同时有一个指针指向它,原有的指针a会被销毁,新的指针会b代替原指针指向内存实例。这就是move操作。当a本身就是内存实例的时候(例如 let a= 1;),再次绑定一个变量b到a的时候,b会新创建一个内存实例,这时,a和b分别是两个内存实例,这个操作就是copy。到底是执行move还是copy取决于原有绑定的类型。

 

13. 关于引用:

引用有两种一种是&T一种是&mut T,两种引用在同一个作用域中不能同时存在,在同一个作用域中只能存在下列情况中的一种:

1)  0个或者多个&T

2)  0个或者1个&mut T

一个引用的生命周期和被引用的变量一样,所以如果变量提前结束生命周期,那么引用也是无效的了。如果引用定义在了变量之前,也会出现这种问题,因为有效的引用必须是指向一个内存地址的:

let y: &i32;
let x = 5;
y = &x;
println!("{}", y);

 14.不同的字符串在程序中只有一份,“a”这个字符串只在heap中存一份。

你可能感兴趣的:(学习笔记)