rust学习(到所有权)
cargo相关
cargo new [project_name]
cargo build
cargo check // 速度快
cargo run
rust 难学,难学 ,难学
rust 安全 ,啥都安全
rust 语法糖还行 ,感觉有像脚本语言
rust 速度挺快
打印hello world! : println!("hello world !");
1. 变量和可变性
let 声明一个变量
mut 声明一个变量为可变的变量,
若不声明默认是不可变的变量
定义格式 : let mut a:i32 = 123 ;
let [mut][name][type] = [value] ;
要么指定值 ,要么指定类型 (强类型语言,编译器必须知道每一个变量是啥类型)
2. 数组类型 分为标量和复合类型
标量:整形、浮点、布尔、字符
整形:u 无符号 i有符号 u8, i8 ~~u128 i128 isize usize(64位或32位,系统的位数)
浮点:f32 f64
数值运算:+ - * / %
布尔运算:&& || !
复合运算符 : += -= *= /= %=
复合类型:原生复合(元组合数组)
1, 元组 () 定长 元祖可以解构赋值给变量 , 每个元素不必相同
可变性 : 元组定义完成后数据类型固定, 不能将在同一个位置指定和定义不同的数据类型
访问 a.x
2. 数组 [] 定长 数组也可以解构赋值给变量, 元素必须相同
可变性: 和元祖相同
访问: a[x]
3. 函数 main() 是入口
格式
fn [function_name]([p1],[p2]...)->[return_type]{
return [value] ;
// or end line [value] 没有;
}
注释: // , /* */
if- else
流程控制
if [condition]{
}else if[condition]{
}else{
}
可以在 = 右边 使用if
循环 loop,while ,for
无限循环
loop{} 可以使用 break ,continue 打断
while[condit]{ }
for element in []{}
for number in ([start]..[end]) , 左闭右开
所有权理解
栈空间不考虑所有权问题(可能只是初学,暂时先这么理解)
堆空间
一个萝卜一个坑, 萝卜一旦换坑 前一个坑就会被编译器埋掉
除非是借用一下的 & , 借用不更改所有权
或者是clone(), 克隆后变成了俩份。 类似于c++的深拷贝。
在不使用引用的情况下函数传递参数会改变实参的所有权,
函数返值也会将所有权移交出去
重点 : 可变引用也会发生所有权的移交 而且是一种隐式的移交
其规则我猜想是如下的:
fn main() {
let mut a = String::from("stringA");// a 拥有string所在空间的所有权
let b = &mut a; //b 是a的一个可变引用
// 注意: let mut b = &a 和 let b = &mut a 是不一样的
// 还有 let mut b = &mut a 也是不一样的
//c++ 表示不亏是我的挑战者,越来越像我的形状了【斜眼笑】
b.push_str("add"); // 通过引用来修改a空间里的东西
// 这时候也会发生数据竞争,a 和b都在竞争同一块堆空间
//println!("{a}"); 如果先要访问a,就会报错
println!("{b}"); // 我的理解是 在上一步 内存的所有权会移动给b,也就是可变引用
//在这里,内存的所有权依然在b上 ,但是可以移交给a ,
//当然也可以不移交,只是拥有了移交的权利
println!("{a}"); // 移交给 a , b 失去所有权
}
用一个通俗的理解就是 借你的东西(能让你改的东西),你最少要用(改)一次。
(不用不行,不用没法还)当然也可以不还一直用,但是一旦还了,你就不能用了
这在的确是不会造成数据竞争 ,而且做法也是比较合乎使用需求的,毕竟
可变引用出现 就是要改值的。改完还给人家也正常。不过就是一旦归还了所有权那这个
可变引用就失效了。以后在写代码时需要注意。