您的位置: 首页> 骑闻 > 正文

Rust - 安装环境、基本类型、流程控制、函数、模块、泛型、所有权|焦点速递

2023-02-27 13:00:33 来源:腾讯云

安装环境、基本类型

学习Rust语言是公司同事最先开始提议的,准备用接下来的项目试试水,Rust是一个强类型编译型语言,比较偏向底层,所以开启了Rust的探索之旅。

环境准备阶段

安装Rust环境

安装命令:


(资料图)

curl --proto "=https" --tlsv1.2 -sSf https://sh.rustup.rs | shsource $HOME/.cargo/env //设置环境变量rustc --version //查看安装版本

Cargo

Cargo 是 Rust 的构建系统和包管理器。Rust 开发者常用 Cargo 来管理 Rust 工程和获取工程所依赖的库。

Cargo 就是Vue里面的npm,php里的composer。

cargo run [项目名称]cargo build 

生成的目录结构如下:

.|-- Cargo.lock|-- Cargo.toml|-- src|   `-- main.rs`-- target    |-- CACHEDIR.TAG    `-- debug        |-- build        |-- deps        |   |-- stark-2c1445affc8ccd97        |   `-- stark-2c1445affc8ccd97.d        |-- examples        |-- incremental        |-- stark        `-- stark.d

数据类型概述

类型是对二进制数据的一种约束行为。类型比起二进制数据,有许多优势:

减少开发者心智负担安全、容易优化

常见的类型分类:

静态类型:在编译器对类型进行检查动态类型:在运行期对类型进行检查强类型:不允许隐式类型转换弱类型:允许隐式类型转换

Rust是强类型语言。

Rust基本数据类型

1.Rust的变量

创建变量使用let关键字变量默认是不可变的,关键字前面加mut转换为可变变量常量使用const关键字定义隐藏属性

2.基础数据类型

Rust是一门静态编程语言,所有变量的类型必须在编译期就被明确规定。

整数:Rust有12种不同类型的整数

对于未明确标明的类型的整数,Rust默认采用i32isize和usize根据系统不同而有不同的长度

长度

有符号

无符号

8-bit

i8

u8

16-bit

i16

u16

32-bit

i32

u32

64-bit

i64

u64

128-bit

i128

u128

128-bit

i128

u128

arch

isize

usize

fn main() {    let number :i8 = 32;    println!("{}",number);}

浮点数型: Rust 与其它语言一样支持 32 位浮点数(f32)和 64 位浮点数(f64)。默认情况下,64.0 将表示 64 位浮点数,因为现代计算机处理器对两种浮点数计算的速度几乎相同,但 64 位浮点数精度更高。

fn main() {    let x = 2.0; // f64    let y: f32 = 3.0; // f32}

布尔值:布尔型用 bool 表示,值只能为 true 或 false。大小为一个字节。

fn main() {    let t = true;    let f: bool = false;}

字符型:字符型用 char 表示。Rust的 char 类型大小为 4 个字节,代表 Unicode标量值,这意味着它可以支持中文,日文和韩文字符等非英文字符甚至表情符号和零宽度空格在 Rust 中都是有效的 char 值。

注意: Rust 中字符串和字符都必须使用 UTF-8 编码,否则编译器会报错。

复合类型

元组

元组用一对 ( ) 包括的一组数据,可以包含不同种类的数据:

fn main() {    let a: i32= 10;    let b = "A";    //创建一个元组    let mytuple:(i32,char) = (a,b);    // 从元组中读取一个值    println!("{},{}",mytuple.0,mytuple.1);    //解封装    let(c , d) = mytuple;    println!(" {} , {} ",c , d);}

数组

数组用一对 包括的同类型数据。Rust语法规定,每个数组的类型必须相同。Rust的数组中不同于其他一些语言中的数组,具有固定长度。

数组下标以0开始,同时Rust存在越界检查。

fn main() {    //初始化数组    let myarray: [u32;5] = [1,2,3,4,5];    println!("myarray[1] = {}",myarray[1]);    //数组越界    //let index = "5".parse::().unwrap();    //println!("myarray[5]={}",myarray[index]);    let mut mybuffer: [u32;32 * 1024] = [10;32*1024];    println!("mybuffer[1024] = {}", mybuffer[1024]);    //修改数组的值    mybuffer[1024] = 13;    println!("mybuffer[1024] = {}", mybuffer[1024]);}

切片

切片(Slice)是对数据值的部分引用。切片这个名字往往出现在生物课上,我们做样本玻片的时候要从生物体上获取切片,以供在显微镜上观察。

fn main() {    //切片可以切数组    let myarray: [u32;5] = [1,2,3,4,5];    let slice = &myarray[0..3];    println!("slice[0] = {}, slice.length = {} ",slice[0],slice.len());    //切片还可以切字符串        let s = String::from("broadcast");    let part1 = &s[0..5];    let part2 = &s[5..9];    println!("{}={}+{}", s, part1, part2);}

Slice没有自己去存储数据,截取的都是引用数据。

结构体

结构体是多种不同数据类型的组合。它与元组类似,但区别在于我们可以为每个成员命名,可以使用struct关键字三种类型的结构。

元组结构经典的C结构无字段的单元结构

结构体使用驼峰命名。

//元组结构struct Pair(i32,f32);//经典的C结构struct Peison {    name:String,    age:u8}fn main() { let pair = Pair(10,4.2); let person = Peison{     name: String::from("stark"),     age:32 }; println!("pair.0 = {}",pair.0); println!("person.name = {}, person.age = {}",person.name,person.age);}

引用派生属性,打印结构体。

#[derive(Debug)]struct Peison {    name:String,    age:u8}fn main() { let person = Peison {     name: String::from("stark"),     age:32 }; println!("{:?}",person);}

枚举

枚举类在 Rust 中并不像其他编程语言中的概念那样简单,但依然可以十分简单的使用:

#[derive(Debug)]enum IPAddr {    IPv4(u8,u8,u8,u8),    IPv6(u8,u8,u8,u8,u8,u8,u8,u8,u8,u8,u8,u8),}fn main() {    let localhost :IPAddr = IPAddr::IPv4(127,0,0,1);    match localhost {        IPAddr::IPv4(a,b,c,d) => {            println!("{},{},{},{}",a,b,c,d);        }        _ => {}    }}

Rust - 流程控制、函数

if else

Rust的if的布尔条件不用括号括起来。if所有分支返回的类型必须相同。

fn main() {    let number = 3;    if number < 5 {        println!("条件为 true");    } else {        println!("条件为 false");    }}

loop、while

Rust提供了loop一个关键字来表示无限循环。while是根据条件进行循环。

fn main() {    let s = ["R", "U", "N", "O", "O", "B"];    let mut i = 0;    loop {        let ch = s[i];        if ch == "O" {            break;        }        println!("\"{}\"", ch);        i += 1;    }}

for range

Rust的 for in 语法可以用来遍历一个迭代器,有多种方法可以创建一个迭代器,最简单也是最常见的方式:

a..b:这里将创建一个a,但不包含b的,步长为1的迭代器a..=b:这里将创建一个a,且包含b的,步长为1的迭代器
fn main() {    for i in 0..5 {        println!("i value is {}",i);    }        println!("-------------");        for i in 0..=5 {        println!("i value is {}",i);    }}

for in 语法第二个重要的使用场景是遍历数组,但这首先将数组转化为一个迭代器,可以通过.iter()或者.iter_mut实现,区别是在于后者是可变的。

fn main() {    let mut myarray = [1,2,3];    for i in myarray.iter(){        println!("i value is {} ",i);    }    for  i in myarray.iter_mut() {        *i *= 2;    }    for i in myarray.iter(){        println!("i value is {} ",i);    }}

遍历关联数组:

fn main() {    let myarray = ["a","b","c"];    for i in myarray.iter(){        println!("i value is {} ",i);    }}

match / if_let / while_let

在Rust 中 没有 switch 语句,matcher 就是 switch 的一个变形,但比其他语言中的 switch 更强大!

let x = 5;match x {    1 => println!("one"),    2 => println!("two"),    3 => println!("three"),    4 => println!("four"),    5 => println!("five"),    _ => println!("something else"),}

函数与方法

函数

函数定义以fn为关键字,它的参数是带类型注释的,就像变量一样,如果函数返回值,则必须在箭头->之后指定返回类型。

fn sum_number(n:u64) -> u64 {    if n < 2 {        n    }else{        n+1    }}fn main() {    println!("sumNumber is {}",sum_number(10))}

函数与闭包

Rust的闭包是一种匿名函数,它可以从它的上下文中捕获变量的值,闭包使用 ||-> 语法定义,闭包可以保存在变量中。

fn main() {    let time3 = |n:u32| -> u32 { n * 3 };    println!("time3 is {}",time3(10));}

move关键字可以从闭包环境中捕获值,它最常用的场景是将主线程中的一个变量传递到了子线程中。

use std::thread;fn main() {    let hi = "hi,stark";    thread::spawn(move || {        println!("stark value {}",hi);    }).join();}

高阶函数 / 发散函数

在数学和计算机科学里,高阶函数至少满足一个条件的函数:

接收一个或多个函数作为输入输出一个函数

在数学中它们叫做算子或泛函,高阶函数是函数式编程中一个重要概念。

fn action(method:fn(u32,u32)->u32,a: u32,b: u32) -> u32 {    method(a,b);}fn add(a:u32,b:u32) ->  u32 {    a + b }fn sub(a:u32,b:u32) ->  u32 {    a - b }fn main() {  println!("{}",action(add,10,20))}

发散函数

发散函数指的是永远不会被返回,它们的返回值标记!,这是一个空类型。

Rust - 使用模块、泛型、所有权

Rust项目的代码组织包含以下三个基本概念:

Package(包)Crate(箱)Module(模块)

Package

Package 用于管理一个或多个Crate,创建一个Package的方式是使用cargo new stark命令:

[root@b0b5a9371ce4 stark]# tree.├── Cargo.toml└── src    └── main.rs1 directory, 2 files

Create

Create是Rust最小单元,既Rust是编译器是以Create为最小单元进行编译的。Create在一个范围内将相关的功能组合在一起,并最终通过编译器生成一个库文件或者是二进制文件。

Module

Module允许我们将一个Create中的代码组织成独立的代码块,以便增强可读性和代码复用,同时Module还控制代码的可见性,将代码分为公开和私有两种属性,定义一个模块的关键字是mod

Module的可见性

Rust中的模块内部的代码、结构体、函数默认是私有的,但是可以通过pub关键字来改变他们的可见性,通过选择性的对外可见性来隐藏模块内部的实现细节。

比较常见的三种pub写法:

pub 成员对模块可见pub(self) 成员对模块内的子模块可见pub(crate) 成员对整个crate可见
mod mod1 {    pub const MESSAGE :&str = "Hello,world";}fn main() {  println!("{}",mod1::MESSAGE)}

Module的引入

在文件开头使用mod 文件路径;,第二种可以映射到一个文件夹,但文件夹中要存在mod.rs,该文件夹可作为一个模块。

结构体的可见性

结构体的字段和方法默认是私有的,通过加上pub修饰语可使得结构体中的字段和方法可以在定义结构体外访问。要注意,与结构体同一个模块和代码的访问结构体中的字段和方法并不要求该字段是可见的。

use 绑定模块成员

使用use绑定类库,as可以指定别名。

使用super与self简化模块路径

除了使用完整路径访问模块内成员,还可以使用super与self关键字相对路径对模块进行访问。

super :上层模块self : 当前模块

泛型

Rust中未指定参数类型的概念叫泛型。

函数参数的泛型

pub fn sum_number>(a:T,b:T) -> T {    return a+b;}

结构体中的泛型

struct Point {    x:T,    y:T}struct Line {    x: Point,    y: Point}fn main() {  println!("{}",cc::MESSAGE);  println!("{}",cc::sum_number(10,20));  let pointx = Point{x:0,y:0};  let pointy = Point{x:10,y:10};  let line = Line {x:pointx, y:pointy};  println!("{},{},{}",line.x.x,line.x.y,line.y.x);}

Rust内存管理

所有权是Rust这门语言的核心概念,Rust最以为豪的内存安全就建立在所有权之上。

Rust采用了一种中间的方案RALL,它兼具GC的易用性和安全性,同时又有极高的性能。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5MlOioAW-1649511656829)(https://note.youdao.com/yws/res/17856/WEBRESOURCE1759d05270a5a0ada71aa6cc869b2c73)

rust所有权

Rust中每个值都绑定有一个变量,称为该值的所有者。每个值只有一个所有者,而且每个值都有它的作用域。一但当这个值离开作用域,这个值占用的内存将被回收。
fn main() {    let s2:String;    {        let s1 = String::from("Hello,world");        s2 = s1;        //println!("s1 value {}",s1);        //value borrowed here after move    }    println!("s2 value {}",s2);}

借用

在有些时候,我们希望使用一个值而不拥有这个值,这种需求在函数调用的时候特别常见。

fn echo(s:String){    println!("{}",s);}fn main() {    let s = String::from("hello.world");    echo(s);    println!("{}",s);}

Rust一个变量只有一个所有权。

fn echo(s:&String){    println!("{}",s);}fn main() {    let s = String::from("hello.world");    echo(&s);    println!("{}",s);}

不可变引用与可变引用

默认情况下,引用是不可变的,如果希望修改引用的值,需要使用&mut

fn change(s: &mut String){    s.push_str("chenged!")}fn main() {    // 要借用的变量s也需要是可变的变量    let mut s = String::from("hello.world");    change(&mut s);    println!("{}",s);}

同一时间内,至多有一个可变引用。

fn main() {    let mut s = String::from("hello.world");    let s1_ref = &mut s;    let s2_ref = &mut s;    println!("{}",s1_ref);    println!("{}",s2_ref);}

生命周期注解

生命周期注解不会改变之前生命周期的长短,它还是原来的生命周期,注解是给编译器看的,拥有相同的生命周期注解,生命周期都是一样的。

fn bigger (str1:&str,str2:&str) -> &str {    if str1 > str2 {        str1    }else{        str2    }}fn main() {    println!("{}",bigger("a","b"));}

结构体当中的生命周期注释

#[derive(Debug)]struct Person {    name: String}fn main() {   let p = Person{ name:String::from("zhangyu") };   println!("{:?}",p );}

关键词: Rust 编程算法 Java

资讯
业界
企业
骑闻
产品
山东芝罘推出人才夜市   打造人才夜市引才品牌
近日,烟台市芝罘区在南尧新都汇广场举办人才夜市,川流不息的求职应聘人群中,不乏高校应届毕业生。据了解,芝罘区为方便求职人才,充分利
2022-10-11
2021年度绿色港口等级评价第一批项目出炉  17个码头获评绿色港口
日前,在由中国港口协会、天津港集团、交通运输部天津水运工程科学研究院、湖南省港务集团共同主办的2022绿色与安全港口大会上,2021年度绿
2022-09-07
“雪糕刺客高温下不融化”引来网友热议 增稠剂过量的雪糕你还敢吃吗
前有雪糕界内卷冲上热搜,后有钟薛高高温下不融化引发热议。这几天,关于雪糕的话题火了。有网友称,在室温31℃左右放置1小时后,钟薛高海
2022-07-05
唐山曹妃甸推动京津冀协同发展 产业协同转移全面提速
春暖渤海湾,书写新画卷。位于唐山曹妃甸的金隅天坛(唐山)木业科技有限公司的生产车间内一片繁忙景象——铺装、压机、翻板等工作正紧张有序
2022-03-19
石家庄海关共签发RCEP原产地证书864份 货值3.9亿元
自今年1月1日RCEP(《区域全面经济伙伴关系协定》)正式实施以来,截至3月14日,石家庄海关共签发RCEP原产地证书864份,货值3 9亿元。据介绍
2022-03-19
蚌埠海关累计签发RCEP原产地证书35份 涉及金额2583.09万元
在蚌埠海关报关大厅原产地证办理窗口,海关关员仔细核对着递交过来的材料。十分钟后,一份RCEP原产地证书打印盖章后交到了企业业务员手中。
2022-03-19
  中新网海口1月23日电(符宇群)海南省第六届人民代表大会第五次会议23日在海口举行第二次全体会议。海南省人民检察院检察长张毅在作报告
2022-01-24
  中新网太原1月23日电 (高雨晴 冉涌 张鹏宇)记者23日从国网山西省电力公司获悉,该公司冬奥保电应急发电队伍已到达河北张家口赛区,
2022-01-24
  中新网西宁1月23日电 (记者 李江宁)据青海省地震局23日消息,中国地震台网正式测定,北京时间2022年1月23日10时21分,在青海海西州德
2022-01-24
  中新网贵阳1月23日电 (周燕玲)对外开放,是内陆开放型经济试验区贵州正在召开的两会热点词汇,如何拓展海内外“朋友圈”助力贵州经济
2022-01-24
温馨生活好young 厦门推广文旅产品火爆全网
  中新网厦门1月23日电 (记者 杨伏山)“冬日暖阳厦门好young”福建省内宣传推广线下活动22日精彩收官。主办方称,本次活动火爆全网及福
2022-01-24
宁夏非遗传承人:刻刀里的守正创新更有“年味”
  (新春见闻)宁夏非遗传承人:刻刀里的守正创新更有“年味”  中新网银川1月23日电 题:宁夏非遗传承人:刻刀里的守正创新更有“年味
2022-01-24
沧州:8个重大科技专项项目确定 引领经济社会高质量发展
为充分发挥科技在经济社会高质量发展中的引领和支撑作用,沧州市确定8个项目为2021年全市重大科技专项项目。这8个重大科技专项项目分别为:
2022-03-19
  中新网海口1月23日电(王子谦 符宇群)海南省高级人民法院院长陈凤超23日说,2021年海南法院为自贸港建设提供坚强司法保障,全年有效管
2022-01-24
  新华社武汉1月23日电(记者王贤)随着春节假期临近,从广州、深圳等地返回湖北的旅客较多。为此,23日,武汉站、汉口站、襄阳东站、十堰
2022-01-24
  1月22日0—24时,广东省新增本土确诊病例3例和本土无症状感染者1例,均为珠海报告。23日,珠海市疫情防控新闻发布会上,珠海市政府副秘
2022-01-24
青海海西州德令哈市发生3.7级地震
  据中国地震台网正式测定,1月23日11时58分在青海海西州德令哈市发生3 7级地震,震源深度9千米,震中位于北纬38 40度,东经97 35度。
2022-01-24
  北京2022年冬奥会和冬残奥会颁奖花束已于近期完成交付。与传统的鲜切花不同,这些花束全部采用上海市非物质文化遗产“海派绒线编结技艺
2022-01-24
濮阳县一中分数线2022 濮阳县一中分数线
1、你好,对于这个问题那要看学校的情况,如果是一般的院校。2、一般网
2023-06-25
提升居民消防安全意识,宝山这里开展系列宣传活动_焦点快播
为进一步提升居民消防安全意识、增强自我保护能力,近日,宝山区高境镇
2023-06-25
国家邮政局:今年全国快递业务量已达600亿件|每日时讯
中新网6月25日电据国家邮政局微信公众号25日消息,国家邮政局监测数据
2023-06-25
世界观速讯丨航空工业南京机电:“粽”情航空 “粽”意坚守
“粽”情航空端午假期,人声鼎沸的不仅有赛龙舟现场,还有航空工业南京
2023-06-25
今日关注:素颜歌曲什么时候出来的_素颜歌曲
1、很喜欢许嵩的歌呢词 曲 编曲:许嵩演唱:许嵩&何曼婷又是一个安静的
2023-06-25
旅游市场消费潜力持续释放
端午节国内旅游出游1 06亿人次,同比增长32 3%——旅游市场消费潜力持
2023-06-25
  中新网西宁1月23日电 (记者 孙睿)据青海省地震台网测定,2022年1月23日10点21分(北京时间)在青海省海西州德令哈市(北纬38 44度,东经
2022-01-24
江西南昌:市民赏年画迎新年 书法家挥毫送春联
  (新春见闻)江西南昌:市民赏年画迎新年 书法家挥毫送春联  1月23日,“赏年画过大年”新年画作品联展江西南昌站活动在江西省文化馆
2022-01-24
  中新网成都1月23日电 (祝欢)成都市第十七届人民代表大会第六次会议23日在成都举行,成都市中级人民法院院长郭彦与成都市人民检察院检
2022-01-24
列车临时停车3分钟救旅客
  (新春见闻)列车临时停车3分钟救旅客  中新网广州1月23日电 (郭军 黄伟伟)“车长,车长,4号车厢有位旅客腹涨难忍,身体不舒服”…
2022-01-24
女子背负命案潜逃24年 因涉疫人员核查落网
  中新网湖州1月23日电(施紫楠 徐盛煜 赵学良)1998年7月,犯罪嫌疑人杜某因家庭琐事,用菜刀将自己的弟媳砍伤致死。案发后,她从老家河
2022-01-24
广东“00后”雄狮少年锤炼功夫迎新春
  (新春见闻)广东“00后”雄狮少年锤炼功夫迎新春  中新社广州1月23日电 题:广东“00后”雄狮少年锤炼功夫迎新春  作者 孙秋霞 
2022-01-24
05-20 中国旅游日!河北创新发展“旅游+” 打造“京畿福地 乐享河北”品牌
中国旅游日!河北创新发展“旅游+” 打造“京畿福地 乐享河北”品牌
5月19日是第12个中国旅游日。今年中国旅游日主题为感悟中华文化,享受美好旅程。河北内环京津,外环渤海,携太行燕山之威,挟畿辅拱卫之要 [详细]
05-20 西湖游船“国潮宋风”特色夜游上线 体验穿越宋风豪华画舫之旅
西湖游船“国潮宋风”特色夜游上线 体验穿越宋风豪华画舫之旅
西湖之胜,晴湖不如雨湖,雨湖不如夜西湖。想要一边沐着晚风,一边乘坐游船感受西湖夜色的别样美景吗?那就来体验一把穿越宋风的豪华画舫之 [详细]
05-20 杭州:露营成今年最大热点 “城市露营”模式受年轻人追捧
杭州:露营成今年最大热点 “城市露营”模式受年轻人追捧
一顶帐篷、一副桌椅、一张地垫,寻个湖畔草坪,就能体验时下最热的旅行方式——露营。五一假期,杭州灵山景区铜鉴湖九曲梅韵和海棠融春两块 [详细]
03-19 2022岳阳国际旅游节开幕 特色农产品展销等系列活动目不暇接
2022岳阳国际旅游节开幕 特色农产品展销等系列活动目不暇接
今天,天下洞庭岳阳市君山区第九届良心堡油菜花节暨2022岳阳国际旅游节开幕,菊红、粉红、水红、桃红、紫色、白色等七色组成的4万亩花海在 [详细]
03-19 2022年郴州计划重点推进文旅项目101个 总投资354亿元
2022年郴州计划重点推进文旅项目101个 总投资354亿元
3月16日,我市举行全市文旅项目和城市大提质大融城项目集中开工仪式,市委书记吴巨培宣布项目开工。郴州嘉合欢乐世界、仙福路工地清风徐来 [详细]
03-19 宿州泗县深入推进文旅融合发展 擦亮城市品牌
宿州泗县深入推进文旅融合发展 擦亮城市品牌
近年来,泗县以争创安徽省文化旅游名县为目标,深入推进文旅融合发展,努力擦亮水韵泗州 运河名城城市品牌,全县文化旅游业实现高质量发展 [详细]
03-19 淡季不忘引流 京郊民宿市场有望迎来回暖
淡季不忘引流 京郊民宿市场有望迎来回暖
旅游淡季中的京郊民宿有望成为市场中最先复苏的板块。3月17日,北京商报记者调查发现,虽然正值旅游淡季,且受疫情变化的影响,不过各家民 [详细]