介绍

特性:

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

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

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

应用场景:

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

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. C++几种特殊形式的函数

    本篇文章主要介绍C++语言中5中特殊形式的函数,分别是带默认形参值的函数.重载函数.内联函数.带形参和返回值的主函数以及递归函数. 一.带默认形参值的函数 如果函数的形参在多数情况下都可以取某个固定的 ...

  2. sql语句实现每日资格设置

    CREATE TABLE 'iDayAuth'( 'openid' VARCHAR(16) NOT NULL , 'iStamp' INT(10) NOT NULL, 'iDayAuth' SMALL ...

  3. JDBC与ODBC的区别

    JDBC简介JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,它是Java十三个规范之一.可以为多种关系数据库提供统一访 ...

  4. 3.0.0 alpha 重磅发布!九大新功能、全新 UI 解锁调度系统新能力

    2022 年 4 月 22 日,Apache DolphinScheduler 正式宣布 3.0.0 alpha 版本发布!此次版本升级迎来了自发版以来的最大变化,众多全新功能和特性为用户带来新的体验 ...

  5. POJ2559/HDU1506 Largest Rectangle in a Histogram (cartesian tree)

    Die datenstruktur ist erataunlich! #include <iostream> #include <cstdio> #include <cs ...

  6. monodepth2学习1-原理介绍

    monodepth2介绍 monodepth2是在2019年CVPR会议上提出的一种三维重建算法,monodepth2是基于monodepth进行了改进,采用的是基于自监督的神经网络,提出了一下三点优 ...

  7. jQuery 查找父元素的函数 parent 和 parents 的区别

    函数 描述 parent([expr]) 查找子节点childNode的父节点,不包括祖先节点 parents([expr]) 查找子节点childNode的父节点,包括祖先节点 Talk is ch ...

  8. jsp获取多选框组件的值

    jsp获取多选框组件的值 1.首先写一个带有多选框的前台页 1 <%@ page language="java" contentType="text/html; c ...

  9. Java 在PDF中添加水印

    在日常工作和学习中,PDF的普及给人们带来了极大的便利,但同时也出现了很多问题. PDF文件容易复制和传播,版权难以保护. 在海量文件中也很难区分信息,例如,你有没有打开一个文件夹,里面有这么多同名的 ...

  10. PHP实现服务器文件预览

    PHP实现服务器里面的所有文件进行预览跟手机文件夹一样 服务器创建一个index.php文件 点我查看 <?php // errors ini_set('display_errors', 1); ...