写点什么

Rust 学习入门

作者:Java-fenn
  • 2022 年 9 月 25 日
    湖南
  • 本文字数:1993 字

    阅读完需:约 7 分钟

Rust 介绍特性:高性能,内存利用率高,没有运行时和垃圾回收


可靠 , 丰富的类型系统和所有权模型保证内存和线程安全,编译器可以消除各种错误


生产力, 包管理器、构建工具一流, 多编辑器支持自动补齐和格式化代码


应用场景:命令行工具,无需解释程序,直接生成目标可执行程序


web 应用, 可以直接生成 WebAssembly


网络服务器, 极低的资源可以做到安全高效,具备大规模并发处理能力


嵌入式设备, 具备 javascript 一般的高效开发语法和 c 语言的执行效率,支持底层平台开发


环境搭建、IDEmac 上安装 rust,使用 rustup 管理工具链


curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh


升级 rust


rustup update


卸载 rust


rustup self uninstall


验证 rust 是否安装


rustc --versionrustc 1.60.0 (7737e0b5c 2022-04-04)IDE 采用 Visual Studio Code, 然后安装两个插件: rls 和 Navite Debug


接下来创建项目运行输出 Hello world 程序


终端执行以下命令,创建 rust-demo 项目,会生成 hello world 程序代码


cargo new rust-demo


编译执行 cargo build 以及 cargo run 命令


cargo buildCompiling rust-demo v0.1.0 (/Users/xx/vs-workspace/rust-demo)Finished dev [unoptimized + debuginfo] target(s) in 1.55scargo runFinished dev [unoptimized + debuginfo] target(s) in 0.00sRunning target/debug/rust-demoHello, world!Cargo 是 Rust 的构建系统和包管理器。Rust 开发者常用 Cargo 来管理 Rust 工程和获取工程所依赖的库


cargo check 检查代码,确保能通过编译,但是不产生可执行文件


发布应用:


cargo build --release 编译会进行优化,运行更快,编译时间更长


rust cargo build 一直出现 Blocking waiting for file lock on package cache 问题解决方案:


如果确定没有多个程序占用,可以删除 rm -rf ~/.cargo/.package-cache,然后再执行


猜数游戏


目标: 生成 1 到 100 随机数, 提示玩家输入一个猜测, 猜完提示猜测太小还是太大. 猜测正确,打印庆祝信息,程序输出


use rand::Rng;use std::cmp::Ordering;use std::io;


fn main() {println!("猜数游戏");let secret_number = rand::thread_rng().gen_range(1..101);


loop {    println!("猜测一个数");    let mut guess = String::new();
io::stdin().read_line(&mut guess).expect("无法读取行");
let guess: u32 = match guess.trim().parse(){ Ok(num) => num, Err(_) => continue, };
println!("你猜测的数据是{}", guess);
match guess.cmp(&secret_number) { Ordering::Less => println!("Too small"), Ordering::Greater => println!("Too big"), Ordering::Equal => { println!("You win"); break; }, }}
复制代码


}rust 库下载: https://crates.io/


数据类型和函数常量和变量:常量 const, 变量 let 声明


shadowing: 可以使用相同的名字声明新的变量,新的变量会隐藏之前声明的同名变量, 使用 let 声明的同名新变量, 它的类型可以与之前的不一样.


标量类型:


整数类型 isize 和 usize 的位数由计算机的架构所决定,使用场景主要对某种集合进行索引操作,整数默认类型是 i32


浮点类型 f32 单精度, f64 双精度 。 默认类型是 f64


布尔类型 bool 一个字节大小


字符类型 char 四个字节大小 , Unicode 变量值


复合类型:


Tuple let tup:(i32, f64, u8) = (500, 6.4, 1) , 访问 tup: tup.0, tup.1, tup.2


数组 let a:[i32; 5] = [1,2,3,4,5] 数组是 stack 上分配的单个块的内存


函数:


声明使用 fn 关键字


函数和变量名使用 snake case , 所有字母小写,单词之间用下划线分开


函数签名必须声明每个参数的类型


-> 声明函数返回值的类型


返回值就是函数体最后一个表达式的值,提前返回使用 return 关键字


注释分以下几种:


  1. // /* / 单行 2./*/多行注释

  2. 用 /// 作为说明文档注释的开头 Cargo 具有 cargo doc 功能,开发者可以通过这个命令将工程中的说明注释转换成 HTML 格式的说明文档。


控制结构 if else: 使用多于一个 else if 可以使用 match 重构代码


loop 循环: break 中止循环


while 循环:


for 循环安全、简洁,在 rust 里用的最多


所有权 rust 特性,让 rust 无需 GC 就可以保证内存安全


rust 内存是通过一个所有权系统来管理,包含一组编译器在编译时检查的规则, 程序运行时,所有权特性不会减慢程序的运行速度


栈内存和堆内存


stack 按值接收顺序存储,后进先出


所有存储在 stack 必须拥有已知的固定的大小


编译时大小未知或运行时大小可能发生变化的数据必须存在 heap 上


指针存放在 stack 中


访问 heap 数据比 stack 慢,需要通过指针才能找到 heap 中的数据


当变量走出作用域,内存会立即自动的交还给系统


应用和借用, & 表示应用. 在特定作用域内,对于某一块数据,只能有一个可变的引用


创建同一个变量的多个可变引用


fn main() {let mut s = String::from("hello"){let s1 = &mut s;}


 let s2 = &mut s;
}
复制代码


不可以同时拥有一个可变应用和一个不可变的引用,多个可变的引用是可以的

用户头像

Java-fenn

关注

需要Java资料或者咨询可加我v : Jimbye 2022.08.16 加入

还未添加个人简介

评论

发布
暂无评论
Rust学习入门_Java_Java-fenn_InfoQ写作社区