当前位置: 首页 > news >正文

论坛网站备案流程图网站备案检验单

论坛网站备案流程图,网站备案检验单,中国招投标网站官网,湖北省建设厅七大员报名网站这是我学习Rust的笔记#xff0c;本文适合于有一定高级语言基础的开发者看不适合刚入门编程的人#xff0c;对于一些概念像枚举#xff0c;泛型等#xff0c;不会再做解释#xff0c;只写在Rust中怎么用。 文章目录 枚举枚举的定义与赋值枚举绑定方法和函数match匹配枚举…这是我学习Rust的笔记本文适合于有一定高级语言基础的开发者看不适合刚入门编程的人对于一些概念像枚举泛型等不会再做解释只写在Rust中怎么用。 文章目录 枚举枚举的定义与赋值枚举绑定方法和函数match匹配枚举if let语句Optionmatch pattern基本patternpattern守卫 泛型泛型函数泛型结构体泛型枚举为结构体绑定泛型方法 traittrait的定义与实现用trait指定定特定方法impl中的trait约束 枚举 枚举的定义与赋值 枚举的定义格式如下 enum 枚举名{ 值1(附加类型), 值2(附加类型),… } 其中关联类型可以省去 例如要创建一个神经网络类型的枚举就可以这样定义 enum NeuralNetwork {CNN,RNN,GAN,Transformer,GNN }下面是传参和创建的例子其中引用的部分可以看后面的所有权生命周期这一部分。 enum NeuralNetwork {CNN,RNN,GAN,Transformer,GNN }fn main(){let nn1 NeuralNetwork::CNN; //创建一个NeuralNetwork类型的枚举值为CNNlet nn2 NeuralNetwork::Transformer;let nn3 nn1;printnn(nn3); //给函数传参printnn(nn2); }fn printnn(network: NeuralNetwork){} //实参表明了需要一个NeuralNetwork类型的引用除此之外枚举可以增加附类型 enum NeuralNetwork { // 所有的网络类型都带有一个附加类型String表示具体的网络名CNN(String),RNN(String),GAN(String),Transformer(String),GNN(String) } enum Test{ // 所有的网络类型都带有一个附加类型String表示具体的网络名e1,e2(String), e3{x: u32, y: f64}, //绑定了一个匿名结构体类型e4(u32, u32, u32) //绑定一个Tuple }fn main(){let nn1 NeuralNetwork::CNN(String::from(TextCNN)); let nn2 NeuralNetwork::Transformer(String::from(Transformer-XL));}枚举绑定方法和函数 与结构体类型对于枚举Rust也允许使用impl关键字来绑定方法和函数 enum NeuralNetwork {CNN(String),RNN(String),GAN(String),Transformer(String),GNN(String) }impl NeuralNetwork {fn make_cnn(s: String) - NeuralNetwork{ //绑定一个函数用于创建CNN类型枚举NeuralNetwork::CNN(s)} }fn main(){let nn1 NeuralNetwork::make_cnn(String::from(TextCNN));let nn2 NeuralNetwork::Transformer(String::from(Transformer-XL));}match匹配枚举 match的语法大致如下 match 变量{ 结果1 表达式1, 结果2 表达式2, _ 剩余结果处理 } enum NeuralNetwork {CNN(String),RNN(String),GAN(String) }fn main(){let nn1 NeuralNetwork::CNN(String::from(TextCNN));match nn1 {NeuralNetwork::CNN(s) println!(CNN 变体为 {}, s), //匹配到对应类型后面写表达式而括号内的s就是枚举所绑定类型NeuralNetwork::RNN(s) println!(RNN 变体为 {}, s),NeuralNetwork::GAN(s) println!(GAN 变体为 {}, s)} }需要注意的是match需要把每一种结果都列出来如果剩下的不想列可以使用通配符_来表示. enum NeuralNetwork {CNN(String),RNN(String),GAN(String) }fn main(){let nn1 NeuralNetwork::CNN(String::from(TextCNN));match nn1 {NeuralNetwork::CNN(s) println!(CNN 变体为 {}, s),_ println!(非CNN) //剩余类型统一处理} }如果箭头后面需要处理更复杂的逻辑则可以用函数块来写如下 enum NeuralNetwork {CNN(String),RNN(String),GAN(String) }fn main(){let nn1 NeuralNetwork::CNN(String::from(TextCNN));match nn1 {NeuralNetwork::CNN(s) {let len s.len();println!(CNN 变体为 {} {}, s, len);},_ println!(非CNN);} }除此之外match其实是有返回值的正如函数块的最后一个运算式为返回值一样match的返回值为后的值 enum NeuralNetwork {CNN(String),RNN(String),GAN(String) }fn main(){let nn1 NeuralNetwork::CNN(String::from(TextCNN));let res match nn1 {NeuralNetwork::CNN(s) {println!(CNN 变体为 {}, s);s //s是返回值返回给res下面同理},NeuralNetwork::RNN(s) {println!(RNN 变体为 {}, s);s},NeuralNetwork::GAN(s) {println!(GAN 变体为 {}, s);s}};println!(res is {}, res) }除了枚举之外match也可以匹配别的值 fn main(){let x 10;match x {1 println!(Is one!),2 println!(Is tow),_ println!(Other number!)}; }fn main(){let x adasdasd;match x {abc println!(Is abc!),efg println!(Is efg),_ println!(Other string!)}; }if let语句 如果指向match一种情况则可以使用if let这个语法糖只针对一种模式进行匹配 enum NeuralNetwork {CNN(String),RNN(String),GAN(String) }fn main(){let nn1 NeuralNetwork::CNN(String::from(TextCNN));if let nn1 NeuralNetwork::CNN{println!(是CNN);} }注意if let后面的判断是而不是。如果想要处理剩余情况可以再加一个else enum NeuralNetwork {CNN(String),RNN(String),GAN(String) }fn main(){let nn1 NeuralNetwork::CNN(String::from(TextCNN));if let nn1 NeuralNetwork::CNN{println!(是CNN);}else{println!(不是CNN);} }Option Option是一种枚举包含两种类型分别是Some和None。Rust设计Option就是为了避免None和其它的值做运算而造成一系列错误而设计的。 Option的定义大致如下 pub enum OptionT {None,Some(T), }Option可以如下使用 fn main(){let x Option::Some(hello);let y: Optionstr Option::None; //这里属于泛型需要指定Option的泛型类型let z x y; // None无法和y运算从而保证了安全性 }fn main(){let _x Option::Some(hello);let y: Optionstr None;match y {Option::None println!(空的),Option::Some(t) println!(非空, 是{}, t)} }match pattern 基本pattern match允许更为复杂的匹配这称之为匹配的pattern其中常用的操作如下 | 用于分割多个可能Rust会从左到右依次检查是否符合 例如a | b | c则会 检查a后检查b再检查是否符合c ()元组用于实现匹配坐标这类的多个参数数据可以用…b, a…b这种Range来进行范围的匹配 注意a…b是左闭右开类型而加上等号则是左闭右闭 _可以用来匹配剩余未匹配的所有值 fn main(){let x: i32 100;match x {1 | 2 | 3 println!(x位于1到3之间), //会依次检查x是1,2还是3.只要匹配一个就进入后面的语句4 ..9 println!(x位于4到9之间),10 | 100..1000 println!(x为10或者100-1000之间的数),_ println!(x不是所期待的数字)}; }fn main(){let x: (i32, i32) (-9, -10);match x {(1, 1) println!(点(1, 1)),(1, 2 | 3 | 4) println!(点(1,2), (1,3)或((1,4))),(..-1, ..-1) println!(第三象限的点),_ println!(其他区域的点)}; }可以使用符号把必要时的某个值绑定到变量上操作为 变量 匹配式 fn main(){let x: (i32, i32) (-9, -10);match x {(1, 1) println!(点(1, 1)),(1, 2 | 3 | 4) println!(点(1,2), (1,3)或((1,4))),(x ..-1, y ..-1) println!(第三象限的点({}, {}), x, y), //绑定第一个空的值到x同理绑定y。_ println!(其他区域的点)}; }pattern守卫 pattern后面可以加上if判断语句来进一步的判断这个匹配是否合法示例如下 fn judge_prime(x: i32) - bool{// TODO: 判断素数true } fn main(){let tmp: (i32, i32) (-9, -10);match tmp {(x 0..10, y _) if x y println!(在yx直线上(0 x 100)),(x 0..100, y 0..100) if judge_prime(x) judge_prime(y) println!((x, y)为0-100内的素数坐标),_ println!()}; }当然if后面的语句可以替换成函数块{}只要其返回值是bool类型即可。 fn judge_prime(_x: i32) - bool{// TODO: 判断素数true }fn main(){let tmp: (i32, i32) (-9, -10);match tmp {(x, y) if x y println!(在yx直线上), //此时xy无绑定也就是无绑定上的约束(x 0..100, y 0..100) if {let tmp: bool judge_prime(x);tmp judge_prime(y)} println!((x, y)为0-100内的素数坐标),_ println!()}; }泛型 如其他语言CPPJAVA一样Rust也支持泛型。 泛型函数 泛型函数需要在函数名上指明泛型类型通常用TU这种大写字母来表示 fn qpowT(base: T, p: i32) - T{//TODO实现快速幂的逻辑 }上述函数中T表示某个抽象的类型而这个类型需要在函数名部分标注出来。随后的base和返回值都是T类型。 当然涉及到两个或者多个翻新类型时需要都在函数名后面声明出 fn TestT, U(x: T, y: U) - (T, U){//TODO }泛型结构体 与函数类似可以在结构体明上声明某个或者多个抽象类型 struct PointT{x: T,y: T } fn main(){let ip Point{x: 10, y: 10}; //此时ip类型为Pointi32let fp Point{x: 10.0, y: 11.1};//此时ip类型为Pointf64 } 注意Rust在编译时会把所有的抽象类型T替换成具体的类型因为Rust是静态的所以在编译之后所有的抽象类型都已经有具体的确定类型的值了。 struct PointT{x: T,y: T } fn main(){let ip: Pointi64 Point{x: 10, y: 10}; //强制约束为i64let fp Point{x: 10.0, y: 11};//报错因为有两个类型 } 泛型枚举 枚举的泛型就是把其变体所绑定的类型内添加泛型前面的Option的Some就是这个原理。 enum TestT, U {SOME(T, U),OTHER(T),NO为结构体绑定泛型方法 为结构体绑定方法使用impl关键字如果该结构体是一个泛型结构体则需要再impl后面加表明抽象类型。 struct PointT{x: T,y: T }impl Pointi32 { //只为i32类型实现判断素数坐标的方法, 由于是实现具体类型所以不需要再impl后面加尖括号fn judge_prime(self) - bool{//TODO判断素数} }implT PointT { //为所有类型都实现一个画图的方法抽象方法要加尖括号表明抽象类型fn show_point(self) - (){//TODO画图} }注意此时impl的泛型参数不影响具体方法的参数 struct PointT, U{x: T,y: U }implT, U PointT, U {fn make_new_pointW(self, other_point: PointT, W) - PointT, W{Point { x: self.x.clone(), //这里会有报错具体原因看后面的trait部分y: other_point.y }} }fn main(){ }trait trait的定义与实现 trait是Rust的一个类似于接口的类型他可以为enumstruct来定义一套标准的接口或者默认的某些方法。 trait 名字{ 函数|抽象函数 } 看下面的例子 trait Draw {fn _draw_atom(self) -(); //实现单个点的绘画是一个抽象的方法fn draw(self) - (){ //draw绘画调用_draw_atom是一个已经实现的方法self._draw_atom()} }使用 impl trait类型 for 结构体|枚举 来为结构体或者枚举绑定方法 struct Point{x: f64,y: f64 }struct Line{A: f64,B: f64 }trait Draw {fn _draw_atom(self) -();fn draw(self) - (){ //该方法为所有实现Draw trait的结构体/枚举所共有self._draw_atom()} }impl Draw for Point { //为Point结构体实现fn _draw_atom(self) -() {println!({} {}, self.x, self.y);} }impl Draw for Line {//为Line结构体实现fn _draw_atom(self) - (){println!({}x {}y 0, self.A, self.B);} } 用trait指定定特定方法 首先对于简单的约束我们可以直接在函数参数后面加上 impl trait类型 的方式来要求某个参数必须实现特定的trait fn Test(x: impl Draw){ //约束x必须实现Draw }如果类型比较多且复杂则可以使用Bound的方式具体做法如下 在函数名后面用尖括号写上泛型然后后面用冒号指定trait 函数名T: trait1 traiit2…, U: trait1traitk… use std::fmt::Display; //使用fmt内的Display trait fn TestT: Draw Display, U: Display(x: T, y: U){} //要求x实现了Draw和Display两个trait而y只要求实现Display这个trait此时你会发现bound约束太长了降低了函数的可读性。于是Rust允许使用where关键字把Bound约束后置, 具体做法如下 在函数尖括号后声明泛型TU等变量。在函数的函数体前用where关键字后面跟上每个泛型变量的约束trait use std::fmt::Display; fn TestT, U(x: T, y: U) whereT: Draw Display, //约束TU: Display //约束U {//TODO函数体 } 我们同样可以再返回类型上约束实现具体的trait。但此时需要注意返回的类型必须要是一种类型不能使用分支语句使其返回多种可能的类型 use std::fmt::Display; fn TestT, U(x: T, y: U) - U //返回类型必须实现了Display whereT: Draw Display, //约束TU: Display //约束U {//TODO函数体 } impl中的trait约束 除此之外在impl中的泛型T也可以进行相对应的trait的约束 implT: Display PointT{ //对所有实现了Display trait的类型T其PointT都会具有test方法fn test(self){}}trait可以进行覆盖实现也就是为所有实现某些trait的类型添加一些方法 trait Hello {fn print_hello(){println!(hello);} }implT: std::fmt::Display Hello for T{//为所有实现了Display这个trait的类型都添加一个print_hello函数} fn main(){i32::print_hello(); //此时实现了Display的i32类型也可以调用这个方法了 }
http://www.tj-hxxt.cn/news/138527.html

相关文章:

  • 西宁做手机网站的公司搜狗推广登录app
  • 怎样做网站变手机软件商业网站建设心得体会
  • 深圳国外网站建设比尤果网做的好的网站
  • 正邦 网站建设网络推广策划方案
  • 注册网站如何备案网站关键词优化的步骤
  • 卡地亚手表官方网站58同城建筑招聘网最新招聘
  • 做网站怎样做全页面服装设计个人工作室
  • 做网站需要知道哪些事情品牌营销推广
  • qq互联网站备案号龙岗外贸网站建设公司
  • 凡客建站登陆西安商城网站开发
  • 南京做网站优化的企业排名学设计在哪学比较好
  • 办公空间设计网站网站设计属于什么经营范围
  • 网站栏目页描述怎么写wordpress分享可见内容
  • wordpress网站背景设置方法电话语音聊天网站建设多少钱
  • 电子商务网站开发设计黑龙江建设网网上办事大厅
  • 济南市做网站的公司怎么做网站扩展
  • 网站进度条源代码juqery-ui建设网站目的及功能定位
  • 上海网站营销推住房和城乡建设部政务服务门户官网
  • 苏州网站建设开发公司工程招标信息在哪看
  • 如何查询网站开发商中企动力公司官网
  • 做一电影网站的apkWordPress FCKEditor
  • 福州做网站企业用dw6做网站
  • 传媒公司网站企业的vi设计都包括哪几种
  • 网站推广策划执行方案seo关键词seo排名公司
  • 网站收录一键提交名字找备案网站
  • 深圳建设工程信息网查询系统sem优化方法
  • 网站建设知名郑州软件开发公司招聘
  • asp网站数据库连接中国商铺网
  • 个体工商网站备案欧美风网站
  • flash做的网站php可视化网站开发工具