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

Rust的入门篇(中)

Rust的入门篇(中)

这是接上面一篇rust入门篇(上)文章

22. 包管理一

mod nation {pub mod government {pub fn govern() {}}mod congress {pub fn legislate() {}}mod court {fn judicial() {super::congress::legislate();}}
}fn main() {nation::government::govern();
}

23. 包管理二

mod back_of_house{pub struct Breakfast{pub toast: String,seasonal_fruit: String,}impl Breakfast{pub fn summer(toast: &str)->Breakfast{Breakfast { toast: String::from(toast), seasonal_fruit: String::from("peaches"),}}}
}pub fn eat_at_restaurant(){let mut meal = back_of_house::Breakfast::summer("Rye");meal.toast = String::from("Wheat");println!("I'd like {} toast please", meal.toast);
}fn main() {eat_at_restaurant();}

24. 包管理三

use std::fs::Permissions;mod SomeModule{pub enum Person{King {name: String},Queen}
}fn main() {let person = SomeModule::Person::King { name: String::from("Blue") };match person {SomeModule::Person::King { name } =>{println!("{}", name);}_=>{}}// Blue
}

25. 包管理四 导入包

second_modules.rs

pub fn message()->String{String::from("this is the 2nd module")
}

main.rs

// 学习如何导入一个外来的模块
mod second_module;fn main(){println!("This is the main module");println!("{}", second_module::message())
}
// This is the main module
// this is the 2nd module

27. 使用use关键字引入包内的函数

mod nation{pub mod government{pub fn govern(){println!("hello world");}}
}// use关键字的使用
use crate::nation::government::govern;fn main(){govern();
}

28. 泛型编程一

模板编程

fn max<T>(array: &[T]) -> T {let mut max_index = 0;let mut i = 1;while i < array.len() {if array[i] > array[max_index] {max_index = i;}i += 1;}array[max_index]
}fn main(){let a = [2, 4, 6, 3, 1];println!("max={}", max(&a));}

28. use as

mod nation{pub mod government{pub fn govern(){println!("nation govern")}}pub fn govern(){println!("govern")}
}use crate::nation::government::govern as nation_govern;
use crate::nation::govern;fn main(){nation_govern(); // nation govern3govern(); // govern}

29. use-pub

mod nation{pub mod government{pub fn govern(){println!("nation govern")}}pub use government::govern;
}use crate::nation::government::govern as nation_govern;
use crate::nation::govern;fn main(){nation_govern(); // nation govern3govern(); // govern}

30. 第三方库

use std::f64::consts::PI;fn main(){println!("{}", (PI*3.0/2.0).sin());}

31. exception1


fn main(){// panic!("error occured");println!("hello, rust");}

32. exception2

use std::fs::File;// 异常处理1
fn main(){let f = File::open("hello.txt");match f{Ok(file) => {println!("File opened successfully.");}Err(err)=>{println!("Failed to open file.");}}}

33. exception3

use std::fs::File;// 异常处理2
fn main(){let f = File::open("hello.txt");if let Ok(file) = f{println!("File opened succefully")} else {println!("fail to open.");}}

34. exception4

use std::fs::File;fn main(){// 可恢复错误按不可恢复错误处理// 不发送错误信息// let f1 = File::open("hello.txt").unwrap();// 发送错误信息// let f2 = File::open("hello.txt").expect("Failed to open");// 啥也没做,不知道是否错误let f2 = File::open("hello.txt");}

35. exception5

// 异常的传递fn f(i:i32)->Result<i32, bool>{if i>=0 {Ok(i)}else {Err(false)}
}fn g(i:i32)->Result<i32, bool>{// ? 符的实际作用是将 Result 类非异常的值直接取出,如果有异常就将异// 常 Result 返回出去。所以,? 符仅用于返回值类型为 Result<T, E> 的函数,// 其中 E 类型必须和 ? 所处理的 Result 的 E 类型一致let t = f(i)?;Ok(t)
}fn main(){let r = g(10000);if let Ok(v) = r{println!("Ok: g(10000) = {}", v);} else {println!("Err");}}

36. exception6

use std::io;
use std::io::Read;
use std::fs::File;// 读取文件,并捕获文件不存在的异常
fn read_text_from_file(path: &str) -> Result<String, io::Error> {let mut f = File::open(path)?;let mut s = String::new();f.read_to_string(&mut s)?;Ok(s)
}fn main() {let str_file = read_text_from_file("d://hello.txt");match str_file {Ok(s) => println!("{}", s),Err(e) => {// kind 方法match e.kind(){io::ErrorKind::NotFound=>{println!("no such file");},_=>{println!("cannot read file.");}}}}
}

37. 泛型编程1

// 非泛型的情况,传入的数据类型只能是i32
fn max(array:&[i32])->i32{let mut max_index = 0;let mut i = 1;while i < array.len(){if array[i] > array[max_index]{max_index = i;}i += 1;}array[max_index]
}fn main(){let a = [2, 4, 6, 3, 1];println!("max={}", max(&a));}

38. 泛型编程2

// 枚举+泛型编程
struct Point<T>{x: T,y: T
}fn main(){let p1 = Point {x:1, y:2};let p2 = Point {x: 1.0, y: 2.0};// p1.x=1, p1.y=2println!("p1.x={}, p1.y={}",  p1.x, p1.y);// 下面错误的,不能使用2个不同的类型// let p3 = Point {x: 1, y: 2.0};}

39. 泛型编程3

// 枚举+泛型编程
struct Point<T1, T2>{x: T1,y: T2
}fn main(){// 使用2个不同的类型let p3 = Point {x: 1, y: 2.0};println!("p3.x={}, p3.y={}",  p3.x, p3.y);}

40. 泛型编程4

在结构体定义泛型方法

struct Point<T>{x: T,y: T
}// 结构体与枚举类定义泛型方法
impl<T> Point<T>  {fn x(&self)->&T{&self.x}
}fn main(){let p = Point{x:1, y:2};println!("p.x = {}", p.x());}

41. 泛型编程5

特性trait的定义与实施

trait Descriptive {fn describe(&self)->String{String::from("[Object]")}
}struct Person{name: String,age: u8
}impl Descriptive for Person {fn describe(&self)->String {format!("{} {}", self.name, self.age)}
}fn main(){let cali = Person{name: String::from("Cali"),age: 24};println!("{}", cali.describe());
}

42. 泛型编程6

// 特性(trait)概念接近于 Java 中的接口(Interface),但两者不完全相同。特性与接
// 口相同的地方在于它们都是一种行为规范,可以用于标识哪些类有哪些方法。
trait Descriptive {fn describe(&self)->String{String::from("[Object]")}
}struct Person{name: String,age: u8
}impl Descriptive for Person {fn describe(&self)->String {format!("{} {}", self.name, self.age)}
}fn main(){let cali = Person{name: String::from("Cali"),age: 24};println!("{}", cali.describe());
}

43. 泛型编程7

综合例子

// 特性例子简介// 定义特性
trait Comparable {fn compare(&self, object: &Self)->i8;    
}// 实现特性 并 绑定到 f64类型下
impl Comparable for f64 {fn compare(&self, object: &f64)->i8{if &self > &object{1}else if &self == &object{0}else {-1}}
}fn max<T: Comparable>(array: &[T])->&T{let mut max_index = 0;let mut i = 1;while i < array.len(){if array[i].compare(&array[max_index])>0{max_index = i;}i += 1;}&array[max_index]
}fn main(){// 默认arr的类型是[f64; 5]let arr = [1.0, 3.0, 5.0, 4.0, 2.0];println!("maximum of arr is {}", max(&arr));
}

44. 泛型编程8

特征做为返回值出现

// 特性作为返回值
trait Descriptive {fn describe(&self)->String{String::from("[Object]")}
}impl Descriptive for Person {fn describe(&self)->String {format!("{} {}", self.name, self.age)}
}struct Person{name: String,age: u8
}// 特征作为返回值出现
fn person() -> impl Descriptive {Person {name: String::from("Cali"),age: 24}
}fn main(){let p = person();println!("{}", p.describe());}

相关文章:

Rust的入门篇(中)

Rust的入门篇(中) 这是接上面一篇rust入门篇(上)文章 22. 包管理一 mod nation {pub mod government {pub fn govern() {}}mod congress {pub fn legislate() {}}mod court {fn judicial() {super::congress::legislate();}} }fn main() {nation::government::govern(); }23.…...

手机设置全局代理ip步骤

在互联网时代&#xff0c;隐私和安全问题备受关注。使用全局代理能够帮助我们保护个人信息&#xff0c;突破地理限制&#xff0c;并提高网络速度。但是&#xff0c;你是否对全局代理的安全性存有疑虑&#xff1f;而且&#xff0c;如何在手机上设置全局代理呢&#xff1f;今天就…...

spring boot+thymeleaf+semantic ui 分页

参考&#xff1a; https://my.oschina.net/ayyao/blog/898041 后端 springboot 使用&#xff1a; com.github.pagehelper.PageInfo&#xff0c;作为分页对象 <!--引入分页插件--> <dependency><groupId>com.github.pagehelper</groupId><artifa…...

【JVM】(一)深入理解JVM运行时数据区

文章目录 一、JVM 运行流程二、虚拟机栈&#xff08;线程私有&#xff09;三、本地方法栈 &#xff08;线程私有&#xff09;四、方法区&#xff08;元数据区&#xff09;五、堆&#xff08;线程共享&#xff09;六、程序计数器&#xff08;线程私有&#xff09; 一、JVM 运行流…...

C++ QRegExpValidator

//正在表达式限制输入 QString str "\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b"; ui->lineEdit->setValidator(new QRegExpValidator(QRegExp(str))); //用于占位 ui->lineEdit->setI…...

备战秋招 | 笔试强训19

目录 一、选择题 二、编程题 三、选择题题解 四、编程题题解 一、选择题 1、二分查找的时间复杂度&#xff08;&#xff09; A. O(N*log(N)) B. O(N) C. O(log(N)) D. O(N^2) 2、有一个单向链表中有一个A、B两个相邻元素&#xff0c;有一个指针p指向元素A&#xff0c;现将…...

第一章 计算机网络概述

第一章 计算机网络概述 1.1 计算机网络在信息时代的作用 1.2 因特网概述 网络分类&#xff1a; 网络&#xff1a;许多计算机连接在一起的的局域网&#xff1b; 互联网&#xff1a;internet许多网络连接在一起&#xff1b; 因特网&#xff1a;Internet 全球最大的互联网&…...

谷粒商城第六天-商品服务之分类管理下的获取三级分类树形列表

目录 一、总述 1.1 前端思路 1.2 后端思路 二、前端部分 2.1 在网页中建好目录及菜单 2.1.1 建好商品目录 2.1.2 建好分类管理菜单 ​编辑 2.2 编写组件 2.2.1 先完成组件文件的创建 2.2.2 编写组件 2.2.2.1 显示三级分类树形列表 三、后端部分 3.1 编写商品分类…...

【UI自动化测试】Appium+Python+Unittest+HTMLRunner

简介 获取AppPackage和AppActivity 定位UI控件的工具 脚本结构 PageObject分层管理 HTMLTestRunner生成测试报告 启动appium server服务 以python文件模式执行脚本生成测试报告 【B站最通俗易懂】Python接口自动化测试从入门到精通&#xff0c;超详细的进阶教程&#xff0c;看完…...

【限时优惠】红帽openstack管理课程(CL210) 即将开课

课程介绍 通过实验室操作练习&#xff0c;学员将能够深入学习红帽企业 Linux OpenStack 平台各服务的手动安装方法&#xff0c;还将了解 OpenStack 开发社区的未来发展计划。 培训地点&#xff1a; 线下面授&#xff1a;苏州市姑苏区干将东路666号401室&#xff1b; 远程…...

Golang之路---02 基础语法——函数

函数 函数定义 func function_name( [parameter list] ) [return_types] {函数体 }参数解释&#xff1a; func&#xff1a;函数由 func 开始声明function_name&#xff1a;函数名称&#xff0c;函数名和参数列表一起构成了函数签名。[parameter list]&#xff1a;参数列表&a…...

数据结构和算法入门(时间/空间复杂度介绍--java版)

数据结构和算法入门&#xff08;时间/空间复杂度介绍–java版&#xff09; write in front 作者&#xff1a; 向大佬学习 专栏&#xff1a; 数据结构&#xff08;java版&#xff09; 作者简介&#xff1a;大二学生 希望能学习其同学和大佬的经验&#xff01; 本篇博客简介&…...

Spring Mvc 文件上传(MultipartFile )—官方原版

一、创建应用程序类 要启动Spring Boot MVC应用程序&#xff0c;首先需要一个启动器。在这个示例中&#xff0c;已经添加了spring-boot-starter thymelaf和spring-boot-starter web作为依赖项。要使用Servlet容器上传文件&#xff0c;您需要注册一个MultipartConfigElement类&…...

【E题】2023年电赛运动目标控制与自动追踪系统方案

系统的设计和制作可以按照以下步骤进行&#xff1a; 设计红色光斑位置控制系统&#xff1a; 选择合适的红色激光笔&#xff0c;并将其固定在一个二维电控云台上。 使用电机和编码器来控制电控云台的水平和垂直运动。 设计一个控制电路&#xff0c;可以通过输入控制信号来控制…...

企业网络安全之零信任和身份认证

零信任并不是一种技术&#xff0c;而是一个安全概念&#xff0c;是一种建立安全战略的理念、方法和框架。 零信任提供了一系列概念和思想&#xff0c;其中心思想是怀疑一切&#xff0c;否定一切&#xff0c;不再以网络边界为限&#xff0c;不能再将内部网络定义为可信任的&…...

【雕爷学编程】MicroPython动手做(28)——物联网之Yeelight 5

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…...

[运维|中间件] 东方通TongWeb使用笔记

参考文献 东方通tongweb部署服务 东方通tongweb部署服务 使用笔记 默认访问地址 http://ip:9060/console/默认用户名密码 TongWeb7.0默认用户名密码&#xff1a;thanos&#xff0c;thanos123.com...

WIZnet W6100-EVB-Pico DHCP 配置教程(三)

前言 在上一章节中我们讲了网络信息配置&#xff0c;那些网络信息的配置都是用户手动的去配置的&#xff0c;为了能跟电脑处于同一网段&#xff0c;且电脑能成功ping通板子&#xff0c;我们不仅要注意子网掩码&#xff0c;对于IP地址主机位和网络位的划分&#xff0c;而且还要注…...

【Linux】Ansible 脚本 playbook 剧本

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 Ansible 脚本 playbook 剧本 playbook 剧本Templates 模块tags 模块Roles 模块在一个 playbook 中使用 roles 的步骤 playbook 剧本 playbooks 本身由以下各部分组成 &#…...

解决 tensorflow 出现的 ImportError: Could not find the DLL(s) ‘msvcp140_1.dll‘. 问题

在安装完tensorflow库后出现 问题详述&#xff1a; ImportError: Could not find the DLL(s) msvcp140_1.dll. TensorFlow requires that these DLLs be installed in a directory that is named in your %PATH% environment variable. You may install these DLLs by downlo…...

百度与AI:历史、投资和监管

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 百度的人工智能在中国具有先发优势 随着ChatGPT的爆火&#xff0c;人工智能重新引起了投资者的注意&#xff0c;然而人工智能并不是突然爆火的&#xff0c;而是全球众多公司在人工智能技术上进行数十年如一日的研发和积累&a…...

Kafka3.0.0版本——Broker(Zookeeper服务端存储的Kafka相关信息)

目录 一、启动zookeeper集群及kafka集群服务启动1.1、先启动三台zookeeper集群服务&#xff0c;再启动三台kafka集群服务1.2、使用PrettyZoo连接zookeeper客户端工具 二、在zookeeper服务端存储的Kafka相关信息 一、启动zookeeper集群及kafka集群服务启动 1.1、先启动三台zook…...

【图论】无向图连通性(tarjan算法)

割边&#xff1a;dfn[u]<low[v] 割点&#xff1a;dfn[u]<low[v] (若为根节点&#xff0c;要有两个v这样的点) 一.知识点&#xff1a; 1.连通&#xff1a; 在图论中&#xff0c;连通性是指一个无向图中的任意两个顶点之间存在路径。如果对于图中的任意两个顶点 u 和 v&…...

Docker安装

Docker实践 yum安装 YUM源可以使用官方YUM源、清华大学开源镜像站配置YUM源&#xff0c;也可以使用阿里云开源镜像站提供的YUM源&#xff0c;建议选择使用阿里云开源镜像站提供的YUM源&#xff0c;原因速度快。 地址: https://developer.aliyun.com/mirror/ 我们安装ce版 …...

06. 计数原理

6. 计数原理 6.1 分类加法计数原理与分步乘法计数原理 分类加法计数原理定义 完成一件事&#xff0c;有 n n n 类办法&#xff0c;在第1类办法中有 m 1 m_1 m1​ 种不同的方法&#xff0c;在第2类办法中有 m 2 m_2 m2​ 种不同的方法&#xff0c;…&#xff0c;在第 n n…...

计算机网络基础(静态路由,动态路由,公网IP,私网IP,NAT技术)

文章目录 一&#xff1a;静态路由和动态路由二&#xff1a;静态路由的配置路由信息的方式演示三&#xff1a;默认路由四&#xff1a;公网IP和私网IP和NAT技术的基本理解 一&#xff1a;静态路由和动态路由 在说静态路由和动态路由前&#xff0c;我们需要来了解一下&#xff0…...

CGAL 点云Alpha-Shape曲面重建算法

文章目录 一、简介二、相关参数三、实现代码四、实现效果参考资料一、简介 在数学上, a l p h a − s h a p e alpha-shape a...

Java 文件过滤器FileFilter | 按条件筛选文件

文章目录 一、概述1.1 何时会用到文件过滤器1.2 工作流程1.3 常用的接口和类1.4 文件过滤器的作用 二、按文件属性过滤2.1 按前缀或后缀过滤文件名2.2 按文件大小过滤 三、按文件内容过滤3.1 文本文件过滤器3.1.1 根据关键字过滤文件内容3.1.2 使用正则表达式过滤文件内容 3.2 …...

python格式化地址信息

背景 最近在折腾一个好玩的库&#xff0c;capa 实现地址的格式化输出。我看的教程是这样的&#xff1a; location_str ["徐汇区虹漕路461号58号楼5楼", "泉州市洛江区万安塘西工业区"] import cpca df cpca.transform(location_str) df在正式的运行代码…...

k8s1.26.6 安装gitlab

Gitlab官方提供了 Helm 的方式在 Kubernetes 集群中来快速安装&#xff0c;但是在使用的过程中发现 Helm 提供的 Chart 包中有很多其他额外的配置&#xff0c;所以我们这里使用自定义的方式来安装&#xff0c;也就是自己来定义一些资源清单文件。 Gitlab主要涉及到3个应用&…...