介绍

特性:

高性能,内存利用率高,没有运行时和垃圾回收

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

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

应用场景:

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

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学习入门的更多相关文章

  1. Rust学习资源和路线

    Rust学习资源和路线 来源 https://rust-lang-cn.org/article/23 学习资源 The Rust Programming Language 堪称Rust的"T ...

  2. [追热点]Rust学习资源整理

    为什么选择Rust 在一次演讲中,谈到微软为解决相应内存问题所做的工作,微软研究人员 Matthew Parkinson 提到了微软正在开发的基于 Rust 的新编程语言 Verona. 摘自:[Ru ...

  3. 每天成长一点---WEB前端学习入门笔记

    WEB前端学习入门笔记 从今天开始,本人就要学习WEB前端了. 经过老师的建议,说到他每天都会记录下来新的知识点,每天都是在围绕着这些问题来度过,很有必要每天抽出半个小时来写一个知识总结,及时对一天工 ...

  4. C# BackgroundWorker组件学习入门介绍

    C# BackgroundWorker组件学习入门介绍 一个程序中需要进行大量的运算,并且需要在运算过程中支持用户一定的交互,为了获得更好的用户体验,使用BackgroundWorker来完成这一功能 ...

  5. 给深度学习入门者的Python快速教程 - 番外篇之Python-OpenCV

    这次博客园的排版彻底残了..高清版请移步: https://zhuanlan.zhihu.com/p/24425116 本篇是前面两篇教程: 给深度学习入门者的Python快速教程 - 基础篇 给深度 ...

  6. 给深度学习入门者的Python快速教程 - numpy和Matplotlib篇

    始终无法有效把word排版好的粘贴过来,排版更佳版本请见知乎文章: https://zhuanlan.zhihu.com/p/24309547 实在搞不定博客园的排版,排版更佳的版本在: 给深度学习入 ...

  7. UML学习入门就这一篇文章

    1.1 UML基础知识扫盲 UML这三个字母的全称是Unified Modeling Language,直接翻译就是统一建模语言,简单地说就是一种有特殊用途的语言. 你可能会问:这明明是一种图形,为什 ...

  8. Stanford Parser学习入门(2)-命令行运行

    在Stanford parser目录中已经定义了一部分命令行工具以及图形界面,本文将介绍如何在windows使用这些工具进行语法分析,Linux下也有shell可以使用. 关于如何搭建环境请参考上一篇 ...

  9. Python学习入门基础教程(learning Python)--5.6 Python读文件操作高级

    前文5.2节和5.4节分别就Python下读文件操作做了基础性讲述和提升性介绍,但是仍有些问题,比如在5.4节里涉及到一个多次读文件的问题,实际上我们还没有完全阐述完毕,下面这个图片的问题在哪呢? 问 ...

随机推荐

  1. 优雅哥学 Webpack - 01 - Webpack 5 快速体验

    程序员优雅哥简介:十年程序员,呆过央企外企私企,做过前端后端架构.分享vue.Java等前后端技术和架构 本文摘要:主要讲解 webpack 5 初体验.从webpack 5 初识到便写代码.优雅哥将 ...

  2. # 8 快速入门 dubbo

    8 快速入门 dubbo 所需资料 注册中心 Zookeeper 安装 zookeeper 官方推荐使用 zookeeper 注册中心: 注册中心负责服务地址的注册与查找,相当于目录服务: 服务提供者 ...

  3. 算法竞赛进阶指南0x35高斯消元与线性空间

    高斯消元 目录 高斯消元 ACWing207. 球形空间产生器(点击访问) 求解思路 代码 ACWing208. 开关问题(点击访问) 思路 代码 总结 欣赏 线性空间 定义 ACWing209. 装 ...

  4. 【Azure 应用服务】PHP应用部署在App Service for Linux环境中,上传文件大于1MB时,遇见了413 Request Entity Too Large 错误的解决方法

    问题描述 在PHP项目部署在App Service后,上传文件如果大于1MB就会遇见 413 Request Entity Too Large 的问题. 问题解决 目前这个问题,首先需要分析应用所在的 ...

  5. dockerfile操作

    简介 Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明. 上下文路径 如下是一个简单的基于dockerfile创建镜像的命令,我们注意到启动处理镜像名和 ...

  6. 并发异步编程之争:协程(asyncio)到底需不需要加锁?(线程/协程安全/挂起/主动切换)Python3

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_208 协程与线程向来焦孟不离,但事实上是,线程更被我们所熟知,在Python编程领域,单核同时间内只能有一个线程运行,这并不是什么 ...

  7. 从贡献第一个 pr 开始,我的开源之路正式开启

    点击上方蓝字关注我们 1 我是一名开源爱好者 我是李进勇,Github Id:JinyLeeChina,目前就职于政采云,专注于大数据平台及数仓领域,是开源项目爱好者. 2 我与小海豚的不解之缘 记得 ...

  8. BZOJ1305/Luogu3153 [CQOI2009]dance跳舞 (network flow)

    #define T 1001 #define S 0 struct Edge{ int nxt,pre,w; }e[500007]; int cntEdge,head[N]; inline void ...

  9. 1.5_HTML基础标签实战演练

    基本的 HTML 标签 HTML 标题 HTML 标题(Heading)是通过 <h1> - <h6> 等标签进行定义的. <h1>This is a headin ...

  10. vim 正则表达式

    1.查找字符串 /str n 下一个 2.替换表达式 :[range]s/from/to/[flags] range:搜索范围,如果没有指定范围,则作用于但前行. :1,10s/from/to/ 表示 ...