首页 > 其他分享 >Rust学习入门

Rust学习入门

时间:2022-09-24 17:45:27浏览次数:78  
标签:cargo guess 入门 学习 let Rust println 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;

    }

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

标签:cargo,guess,入门,学习,let,Rust,println,rust,内存
From: https://www.cnblogs.com/bigdata1024/p/16726065.html

相关文章

  • Servlet快速入门
     创建Servlet:创建web项目,导入Servlet依赖坐标<dependency><groupld>javax.servlet</groupld><artifactld>javax.servlet-api</artifactld><version>3.1.0</version>......
  • python入门03
    python入门day3目录昨日内容回顾§一、计算机的五大组成部分详解和三大核心硬件1、计算机的五大组成部分详解2、计算机的三大核心硬件3、操作系统OperatingSystem4、编......
  • 2022-2023-1 20221404 《计算机基础与程序设计》第四周学习总结
    2022-2023-120221404《计算机基础与程序设计》第X周学习总结作业信息班级链接(2022-2023-1-计算机基础与程序设计)作业要求(2022-2023-1计算机基础与程序设计第......
  • maven 学习笔记
    maven介绍1、是一个依赖管理工具2、自定义本地仓库例如:d:\javaStudy\maven20203、当项目使用时会首先检查本地是否存在,减少每次拉取远程仓库依赖包4、配置文件pom.xml......
  • 2022-2023-1 20221305《计算机基础与程序设计》第四周学习总结
    学期(2022-2023-1)学号(20221305)《计算机基础与程序设计》第四周学习总结作业信息这个作业属于哪个课程<班级的链接>(如2022-2023-1-计算机基础与程序设计)这个作......
  • Maven快速配置和入门
    概念Maven其实就是一个管理项目、构建项目的工具。它有标准化的项目结构、构建流程、依赖管理。功能Maven提供了一套标准的项目结构Maven提供了一套标准的构建流程Ma......
  • MarKdown学习
    Markdown学习标题三级标题四级标题字体helloworldhelloworldhelloworldhelloworld引用引用符合>分割线三个---三个***图片![图片名称](C:\Users\1......
  • std::bind()功能学习
    转自:https://blog.csdn.net/Jxianxu/article/details/1073820491.介绍std::bind的头文件是<functional>,它是一个函数适配器,接受一个可调用对象(callableobject),生成一个......
  • 并发学习记录13:不可变
    问题的提出日期转换的问题在多线程的环境下做日期转换很可能出现线程安全问题:代码:@Slf4j(topic="ch.UnchangeTest01")publicclassUnchangeTest01{publicst......
  • Python基础教程,Python入门教程(超详细)
    Python由荷兰数学和计算机科学研究学会于1990年代初设计,作为一门叫做ABC语言的替代品。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应......