Rust学习入门
介绍
特性:
高性能,内存利用率高,没有运行时和垃圾回收
可靠 , 丰富的类型系统和所有权模型保证内存和线程安全,编译器可以消除各种错误
生产力, 包管理器、构建工具一流, 多编辑器支持自动补齐和格式化代码
应用场景:
命令行工具,无需解释程序,直接生成目标可执行程序
web应用, 可以直接生成WebAssembly
网络服务器, 极低的资源可以做到安全高效,具备大规模并发处理能力
嵌入式设备, 具备javascript一般的高效开发语法和c语言的执行效率,支持底层平台开发
环境搭建、IDE
mac	上安装rust,使用rustup 管理工具链
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
升级rust
rustup update
卸载rust
rustup self uninstall
验证rust 是否安装
rustc --version
rustc 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 build
   Compiling rust-demo v0.1.0 (/Users/xx/vs-workspace/rust-demo)
    Finished dev [unoptimized + debuginfo] target(s) in 1.55s
cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.00s
     Running `target/debug/rust-demo`
Hello, 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./*
 */
 多行注释
3. 用 /// 作为说明文档注释的开头
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;
    }
不可以同时拥有一个可变应用和一个不可变的引用,多个可变的引用是可以的
Rust学习入门的更多相关文章
- Rust学习资源和路线
		
Rust学习资源和路线 来源 https://rust-lang-cn.org/article/23 学习资源 The Rust Programming Language 堪称Rust的"T ...
 - [追热点]Rust学习资源整理
		
为什么选择Rust 在一次演讲中,谈到微软为解决相应内存问题所做的工作,微软研究人员 Matthew Parkinson 提到了微软正在开发的基于 Rust 的新编程语言 Verona. 摘自:[Ru ...
 - 每天成长一点---WEB前端学习入门笔记
		
WEB前端学习入门笔记 从今天开始,本人就要学习WEB前端了. 经过老师的建议,说到他每天都会记录下来新的知识点,每天都是在围绕着这些问题来度过,很有必要每天抽出半个小时来写一个知识总结,及时对一天工 ...
 - C# BackgroundWorker组件学习入门介绍
		
C# BackgroundWorker组件学习入门介绍 一个程序中需要进行大量的运算,并且需要在运算过程中支持用户一定的交互,为了获得更好的用户体验,使用BackgroundWorker来完成这一功能 ...
 - 给深度学习入门者的Python快速教程 - 番外篇之Python-OpenCV
		
这次博客园的排版彻底残了..高清版请移步: https://zhuanlan.zhihu.com/p/24425116 本篇是前面两篇教程: 给深度学习入门者的Python快速教程 - 基础篇 给深度 ...
 - 给深度学习入门者的Python快速教程 - numpy和Matplotlib篇
		
始终无法有效把word排版好的粘贴过来,排版更佳版本请见知乎文章: https://zhuanlan.zhihu.com/p/24309547 实在搞不定博客园的排版,排版更佳的版本在: 给深度学习入 ...
 - UML学习入门就这一篇文章
		
1.1 UML基础知识扫盲 UML这三个字母的全称是Unified Modeling Language,直接翻译就是统一建模语言,简单地说就是一种有特殊用途的语言. 你可能会问:这明明是一种图形,为什 ...
 - Stanford Parser学习入门(2)-命令行运行
		
在Stanford parser目录中已经定义了一部分命令行工具以及图形界面,本文将介绍如何在windows使用这些工具进行语法分析,Linux下也有shell可以使用. 关于如何搭建环境请参考上一篇 ...
 - Python学习入门基础教程(learning Python)--5.6 Python读文件操作高级
		
前文5.2节和5.4节分别就Python下读文件操作做了基础性讲述和提升性介绍,但是仍有些问题,比如在5.4节里涉及到一个多次读文件的问题,实际上我们还没有完全阐述完毕,下面这个图片的问题在哪呢? 问 ...
 
随机推荐
- 4-6 Mabatis 框架
			
Mabatis 框架 Ⅰ.关于Mabatis 对数据库中的数据进行访问的框架 数据库执行过程: 连接数据库-->准备好SQL-->发送SQL语句-->执行语句-->获取结果-- ...
 - 作业二、安装CentOS7.9
			
一.安装环境 1.VMware Workstation 16 Pro 2.CentOS7.9 二.部署系统 步骤1.进入VMware,点击创建新的虚拟机 步骤2.进入新建虚拟机向导,选择典型(推荐) ...
 - Linux系列之管理用户环境变量
			
前言 环境变量控制你在Linux工作环境中的外观.行为和感觉.一共有两种类型的变量: 环境变量:这些是内置于系统中的进程范围的变量,控制着系统的外观和行为.因为是进程范围的,所以它们被任何子shell ...
 - Java学习 (七)基础篇 变量
			
变量 变量顾名思义,就是可以变化的量 Java是一种强类型语言,每个变量都必须声明其类型 Java变量是程序中最基本的存储单位,其要素包括变量名.变量类型和作用域 type varName [=val ...
 - RISC-CPU设计和 FPGA 实现
			
摸鱼的时候找到一份单周期和多周期的riscv的fpga实现,还是挺符合我的预期的 知乎专栏地址:https://www.zhihu.com/column/c_1530950608688910336
 - Luogu P5030 长脖子鹿放置(网络流)
			
匈牙利T了,Dinic飞了... 按奇偶连 #include <cstdio> #include <iostream> #include <cstring> #in ...
 - 国产时序数据库IotDB安装、与SpringBoot集成
			
一.简介: 本文将完成一个真实业务中的设备上报数据的一个例子,完整的展示后台服务接收到设备上报的数据后,将数据添加到时序数据库,并且将数据查询出来的一个例子.本文所有代码已经上传GitHub:http ...
 - ArrayList,LinkedList
			
ArrayList,LinkedList ArrayList 采用的是数组形式来保存对象的,这种方式将对象放在连续的位置中,所以最大的缺点就是插入删除时非常麻烦LinkedList 采用的将链表的数据 ...
 - java学习第一天.day01
			
Java的编译和运行机制 java文件编译成字节码文件后加载到java缓存中jvm Java的基本语法 1.Java语言严格区分大小写 2.一个Java源文件里可以定义多个Java类,但不能存在多个p ...
 - 理解 Flutter 的基础概念:Widget
			
Widget 的本意是组件的意思,熟悉 Web 应用开发的人在后期必定会接触到 Vue.React 等框架,这些框架都有一个核心的概念 -- 组件.组件的目的也很简单,那就是重复率用一段代码,并且能够 ...