技术栈rust、diesel、actixweb、postgresql点击链接查看01.Rust实战环境搭建(https://www.bilibili.com/video/BV16B4y1q7Sq?p=40)02.Rust实战错误处理(https://www.bilibili.com/video/BV16B4y1q7Sq?p=41)03.Rust实战数据库相关(https://www.bilibil
为什么在39节介绍了闭包相关内容?因为在大多数情况下,无论是使用futures还是async/await实现std::future::Futuretrait都只是另一个包装闭包的结构!下面写2个普通函数rustfndo3(){foriin1..=5{println!("do3{}",i);sleep(Duration::from_millis(500));}}fndo4(){foriin1..=5
2019年11月,Rust1.39.0中asyncawait的发布增加了它作为现代系统编程语言的吸引力,并使其更容易编写高度并发的服务。现在要完全理解和理解asyncawait是如何产生的,如何使用它。我们看一下如何演进出来的。新建项目cargonewuse_closuer39打开src/main.rsletadd=x,yx+y;letresult=add(3,4);println!("{}",r
在一些场合下,用match匹配枚举类型并不优雅。iflet在这样的场合要简洁得多,并且允许指明数种失败情形下的选项:lets=Some("从0到Go语言微服务架构师");lets1:Option<i32=None;lets2:Option<i32=None;//如果let将s解构成Some(i),则执行语句块({})ifletSome(i)=s{println!("已上车{:?}!",i);}//
Rust通过match关键字来提供模式匹配,和C语言的switch用法类似。第一个匹配分支会被比对,并且所有可能的值都必须被覆盖。解构枚举见22小节内容解构指针和引用对指针来说,解构(destructure)和解引用(dereference)要区分开,因为这两者的概念是不同的,和C那样的语言用法不一样。解引用使用\解构使用&、ref、和refmut//获得一个i32类型的引用。&表示取引用。let
Rust使用trait解决类型之间的转换问题。最一般的转换会用到From和Into两个trait。From和IntoFrom和Into两个trait是内部相关联的,实际上这是它们实现的一部分。如果我们能够从类型B得到类型A,那么很容易相信我们也能把类型B转换为类型A。FromFromtrait允许一种类型定义“怎么根据另一种类型生成自己”,因此它提供了一种类型转换的简单机制。在标准库中有无数Fro
类型转换Rust不提供原生类型之间的隐式类型转换,但可以使用as关键字进行显式类型转换。整型之间的转换大体遵循C语言的惯例,除了C会产生未定义行为的情形。在Rust中所有整型转换都是定义良好的。letspend=1;//错误!不提供隐式转换//errorE0308:mismatchedtypes//letcost:f64=spend;//可以显式转换letcost=spendasf64;print
变量绑定默认是不可变的(immutable),但加上mut修饰语后变量就可以改变。作用域和遮蔽变量绑定有一个作用域(scope),它被限定只在一个代码块(block)中生存(live)。代码块是一个被{}包围的语句集合。另外也允许变量遮蔽(variableshadowing)。//此绑定生存于main函数中letspend=1;//这是一个代码块,比main函数拥有更小的作用域{//此绑定只存在于
我们常说功能模块,就是用于将函数或结构体按照功能分组。也常常把相似的函数或者实现相同功能的或者共同实现一个功能的函数和结构体划分到一个模块中。Rust中的模块,类似C中的命名空间,Java语言中的包。在代码组织上,比模块更高级的是crate,一个crate可以存放多个模块,在Rust语言中crate是基本编译单元,分为可执行二进制文件(包含main函数作为程序入口)或者一个库。crates.io是
Rust语言也有错误这个概念,而且把错误分为两大类:可恢复和不可恢复,相当于其它语言的异常和错误。Name描述Recoverable可以被捕捉,相当于其它语言的异常ExceptionUnRecoverable不可捕捉,会导致程序崩溃退出panic!()不可恢复错误panic!()程序立即退出,退出时调用者抛出退出原因。一般情况下,当遇到不可恢复错误时,程序会自动调用panic!()。fnmain(
1.现代的操作系统,是一个多任务操作系统,系统可以管理多个程序的运行,一个程序往往有一个或多个进程,而一个进程则有一个或多个线程。2.让一个进程可以运行多个线程的机制叫做多线程。3.一个进程一定有一个主线程,主线程之外创建出来的线程叫子线程多线程(并发)编程的一个重要思想就是程序不同的部分可以同时独立运行互不干扰。创建线程std::thread::spawn()//spawn()函数的原型pubf
Rust中的闭包(closure),也叫做lambda表达式或者lambda,是一类能够捕获周围作用域中变量的函数。调用一个闭包和调用一个函数完全相同,不过调用闭包时,输入和返回类型两者都可以自动推导,而输入变量名必须指明。其他的特点包括:声明时使用替代()将输入参数括起来。函数体定界符({})对于单个表达式是可选的,其他情况必须加上。有能力捕获外部环境的变量。定义闭包普通函数fn函数名(参数列表
迭代器就是把集合中的所有元素按照顺序一个接一个的传递给处理逻辑。Iterator特质有两个函数:一个是iter(),用于返回一个迭代器对象,也称之为项(items)。一个是next(),用于返回迭代器中的下一个元素。如果已经迭代到集合的末尾(最后一个项后面)则返回None。fnmain(){letv=vec!"Go语言极简一本通","Go语言微服务架构核心22讲","从0到Go语言微服务架构师";
Rust语言使用结构体File来描述/展现一个文件。所有对结构体File的操作方法都会返回一个Result枚举。以下是一些常用的文件方法模块方法说明std::fs::Fileopen()静态方法,以只读模式打开文件std::fs::Filecreate()静态方法,以可写模式打开文件。如果文件存在则清空旧内容如果文件不存在则新建std::fs::remove_fileremove_file()从文
I/O就是输入(Input)/输出(Output)。Rust语言IO输入输出的三大块内容:读取数据、写入数据、命令行参数。读取和写入Rust标准库IO输入输出以下2个Trait特质说明Read用于从输入流读取字节数据Write用于向输出流中写入数据,包含字节数据和UTF8数据两种格式fnmain(){letmutin_word=String::new();letresult=std::io::st
泛型是运行时指定数据类型的一种机制。好处是通过高度的抽象,使用一套代码应用多种数据类型。比如我们的向量,可以使用数值类型,也可以使用字符串类型。泛型是可以保证数据安全和类型安全的,还同时减少代码量。Rust语言中的泛型主要包含泛型集合、泛型结构体、泛型函数、范型枚举和特质。Rust使用使用<T语法来实现泛型,其中T可以是任意数据类型。泛型集合我们之前用过的向量。我们可以创建i32类型的,也可以创建
Rust语言标准库提供了通用的数据结构的实现。包括向量(Vector)、哈希表(HashMap)、哈希集合(HashSet)。向量(Vector)Rust在标准库中定义了结构体Vec用于表示一个向量。向量和数组很相似,只是数组长度是编译时就确定了,定义后就不能改变了,那要么改数组,让他支持可变长度,显然Rust没有这么做,它用向量这个数据结构,也是在内存中开辟一段连续的内存空间来存储元素。特点:向
枚举enum关键字允许创建一个从数个不同取值中选其一的枚举类型(enumeration)。任何一个在struct中合法的取值在enum中也合法。在日常生活中很常见。比如:1年有12个月,1周有7天。枚举的定义enum枚举名称{variant1,variant2,...}使用枚举枚举名称::variantderive(Debug)enumRoadMap{Go语言极简一本通,Go语言微服务架构核心22
结构体(struct)可以由各种不同类型组成。使用struct关键字来创建。struct是structure的缩写。结构体可以作为另一个结构体的字段。结构体是可以嵌套的。元组结构体(tuplestruct),事实上就是具名元组而已。structPair(String,i32);经典的C语言风格结构体(Cstruct)。struct结构体名称{...}单元结构体(unitstruct),不带字段,在
切片是只向一段连续内存的指针。在Rust中,连续内存够区间存储的数据结构:数组(array)、字符串(string)、向量(vector)。切片可以和它们一起使用,切片也使用数字索引访问数据。下标索引从0开始。slice可以指向数组的一部分,越界的下标会引发致命错误(panic)。切片是运行时才能确定的,并不像数组那样编译时就已经确定了。切片的定义let切片值=&变量起始位置..结束位置1.起始位
生活中,我们对工具有所有权,但是也不妨碍我们可以把工具借给别人甚至租用给别人,别人用完了,要还给你的。Rust中,Borrowing(借用),就是一个函数中的变量传递给另外一个函数作为参数暂时使用。也会要求函数参数离开自己作用域的时候将所有权还给当初传递给它的变量(好借好还,再借不难嘛!)。&变量名//要把参数定义的时候这样定义。例子如下:fnshow(v:&Vec<&str){println!(
因为变量要负责释放它们拥有的资源,所以资源只能拥有一个所有者。这也防止了资源的重复释放。注意并非所有变量都拥有资源(例如引用)。在进行赋值(leta=b)或通过值来传递函数参数(foo(a))的时候,资源的所有权(ownership)会发生转移。按照Rust的规范,这被称为资源的移动(move)。在移动资源之后,原来的所有者不能再被使用,这可避免悬挂指针(danglingpointer)的产生。内
数组是用来存储一系列数据,拥有相同类型T的对象的集合,在内存中是连续存储的。使用中括号来创建,且它们的大小在编译时会被确定。数组下标是从0开始。数组是在栈中分配的,数组可以自动被借用成为切片(slice)。数组的声明和初始化let变量名:数据类型;数组长度=值1,值2,值3,...;letarr1:&str;3="Go语言极简一本通","Go语言微服务架构核心22讲","从0到Go语言微服务架构师
Tuple元组是一个复合类型,可以存储多个不同类型的数据。Rust支持元组tuple类型。元组使用括号()来构造(construct)。函数可以使用元组来返回多个值,因为元组可以拥有任意多个值。元组一旦定义,就不能再增长或缩小,长度是固定的。元组的下标从0开始。定义元组lettuple变量名称:(数据类型1,数据类型2,...)=(数据1,数据2,...);lettuple变量名称=(数据1,数据
函数是一组一起执行一个任务的语句块。每个Rust程序都至少有一个函数,即主函数main()。划分的标准是每个函数执行一个单一的任务。这也是软件设计中经常说的单一职责。这会让你的代码可读性更好。函数的定义定义函数时必须以fn关键字开头,fn关键字是function的缩写。函数名称的命名规则和变量的命名规则一致。fn函数名称(参数:数据类型)返回值{//函数代码}参数用于将值传递给函数内部的语句。参数
现实中的循环很多,比如我们在学校操场里跑步,一圈一圈的跑。在计算机中,循环其实就是一种重复,在满足指定的条件下,重复的做某些事情。Rust语言中也有三种表示循环的语句:loop语句。一种重复执行且永远不会结束的循环。while语句。一种在某些条件为真的情况下就会永远执行下去的循环。for语句。一种有确定次数的循环。for循环for临时变量in左区间..右区间{//执行业务逻辑}左区间..右区间,这
条件判断语句说明if语句if语句用于模拟现实生活中的如果...就...if...else语句if...else语句用于模拟如果...就...否则...else...if和嵌套if语句嵌套if语句用于模拟如果...就...如果...就...match语句match语句用于模拟现实生活中的老师点名或银行叫if语句if条件表达式{//条件表达式为true时要执行的逻辑}lettotal:f32=666.
Rust语言支持以下四种运算符算术运算符位运算符关系运算符逻辑运算符算术运算符名称运算符加+减乘\除/求余%注:Rust语言不支持自增自减运算符和关系运算符名称运算符说明大于如果左操作数大于右操作数则返回true否则返回false小于<如果左操作数小于于右操作数则返回true否则返回false大于等于=如果左操作数大于或等于右操作数则返回true否则返回false小于等于<=如果左操作数小于或等于
Rust语言提供了两种字符串Rust核心内置的数据类型&str,字符串字面量。Rust标准库中的一个公开pub结构体。字符串对象String。字面量&str字符串字面量的核心代码可以在模块std::str中找到。Rust中的字符串字面量被称之为字符串切片。因为它的底层实现是切片。letlesson="Go语言微服务架构核心22讲";字面量&str就是在编译时就知道其值的字符串类型,它也是字符的集合
常量就是那些值不能被改变的变量。定义后,再也没有任何方法可以改变常量的值。const:不可改变的值(通常使用这种)。static:具有'static生命周期的,可以是可变的变量(须使用staticmut关键字)。有个特例就是"string"字面量。它可以不经改动就被赋给一个static变量,因为它的类型标记:&'staticstr就包含了所要求的生命周期'static。其他的引用类型都必须特地声明
Copyright © 2005-2025 51CTO.COM 版权所有 京ICP证060544号