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

Rust的入门篇(下)

这篇博客是rust入门篇下

45. 生命周期注释

// 生命周期// 下面代码不能通过编译
// longer 函数取 s1 和 s2 两个字符串切片中较长的一个返回其引用值
// 返回值引用可能会返回过期的引用
// fn longer(s1: &str, s2: &str) -> &str {
//     if s2.len() > s1.len() {
//         s2
//     } else {
//         s1
//     }
// }// 生命周期注释
// &i32        // 常规引用
// &'a i32     // 含有生命周期注释的引用
// &'a mut i32 // 可变型含有生命周期注释的引用fn longer<'a>(s1:&'a str, s2:&'a str)->&'a str{if s2.len()>s1.len(){s2} else {s1}
}fn main(){let r;{let s1 = "rust";let s2 = "ecmascript";r = longer(s1, s2);println!("{} is longer", r);}}

46. 生命周期2

结构体中使用字符串切片引用

// 结构体中使用字符串切片引用fn main(){struct Str<'a>{content: &'a str}let s = Str{content: "string_slice"};println!("s.content={}", s.content);}

47. 泛型 特性 和 生命周期的综合例子

// 泛型、特性与生命周期 一起来use std::fmt::Display;fn longest_with_an_announcement<'a, T>(x: &'a str, y: &'a str, ann: T)-> &'a str where T: Display{println!("Announcement! {}", ann);if x.len() > y.len(){x} else{y}
}fn main(){let r = longest_with_an_announcement("abcd", "efg", "hello");println!("longest {}", r);
}

48. 接收命令行参数

// 接收命令行参数fn main(){let args = std::env::args();println!("{:?}", args);// Args { inner: ["target\\debug\\greeting.exe"] }// 遍历for arg in args{// target\debug\greeting.exeprintln!("{}", arg);}}

49. 从命令行传入字符串

// 命令行输入输入一些字母 IO流
use std::io::stdin;fn main(){let mut str_buf = String::new();// 从命令行输入一些字符stdin().read_line(&mut str_buf).expect("failed to read line");println!("your input line is \n{}", str_buf);}

50. 从文件读入

// 从文件读取字符
use std::fs;fn main(){let text = fs::read_to_string("d:/hello.txt").unwrap();println!("{}", text);}

51. 读取文件

整个文件一次性读取

// 从文件读取字符
use std::fs;fn main(){let content = fs::read("D:/text.txt").unwrap();println!("{:?}", content);}

52. IO流

// 流读取
use std::fs::{self, File};
use std::io::prelude::*;fn main(){let mut buffer = [0u8; 5];let mut file = fs::File::open("d:/text.txt").unwrap();file.read(&mut buffer).unwrap();println!("{:?}", buffer);file.read(&mut buffer).unwrap();println!("{:?}", buffer);}

53. 文件写入

use std::fs;fn main(){// 文件写入fs::write("d:/text.txt", "FROM RUST PROGRAM").unwrap();
}

54. 文件末尾追加字符

use std::io::prelude::*;
use std::fs::OpenOptions;fn main()->std::io::Result<()>{let mut file = OpenOptions::new().append(true).open("d:/text.txt")?;file.write(b" APPEND WORD");Ok(())
}

55. 读写方式打开文件


use std::io::prelude::*;
use std::fs::OpenOptions;fn main()->std::io::Result<()>{let mut file = OpenOptions::new().read(true).write(true).open("d:/text.txt")?;file.write(b"COVER")?;Ok(())}

56. 集合一

集合的创建

// 集合创建
fn main(){let vector: Vec<i32> = Vec::new(); // 创建类型为 i32 的空向量let vector = vec![1, 2, 4, 8]; // 通过数组创建向量}

57. 向集合添加元素

使用push添加元素

// push 添加 元素
fn main(){let mut vector = vec![1, 2, 4, 8];vector.push(16);vector.push(32);vector.push(64);println!("{:?}", vector);}

58. 在集合末尾添加一个集合

// append 添加集合
fn main(){let mut v1:Vec<i32> = vec![1, 2, 4, 8];let mut v2:Vec<i32> = vec![16, 32, 64];v1.append(&mut v2);println!("{:?}", v1);}

59. 集合遍历和取元素


fn main(){let mut v = vec![1, 2, 4, 8];// 相对安全的取值方法println!("{}", match v.get(0) {Some(value)=>value.to_string(),None=>"None".to_string()});// 下标取值let v = vec![1, 2, 4, 8];println!("{}", v[1]);// 遍历let v = vec![100, 32, 57];for i in &v{println!("{}", i);}}

60. string字符串操作


fn main(){// 新建字符串let string = String::new();// 基础类型转成字符串let ont = 1.to_string();let float = 1.3.to_string();let slice = "slice".to_string();//  包含 UTF-8 字符的字符串let hello = String::from("السلام عليكم");let hello = String::from("Dobrý den");let hello = String::from("Hello");let hello = String::from("שָׁלוֹם");let hello = String::from("नमस्ते");let hello = String::from("こんにちは");let hello = String::from("안녕하세요");let hello = String::from("你好");let hello = String::from("Olá");let hello = String::from("Здравствуйте");let hello = String::from("Hola");// 字符串追加let mut s = String::from("run");s.push_str("oob");s.push_str("!");// + 拼接字符串let s1 = String::from("Hello, ");let s2 = String::from("world!");let s3 = s1 + &s2;// 使用format!宏let s1 = String::from("tic");let s2 = String::from("tac");let s3 = String::from("toe");let s = format!("{}-{}-{}", s1, s2, s3);let s = "hello";let len = s.len();// 中文字符长度let s = "你好";let len = s.len(); // 6 中文utf-8编码,一个字长3个字节println!("{}", len);// 中文字符正确长度let s = "你好";let len = s.chars().count(); // 2println!("{}", len);// 字符串遍历let s = String::from("hello中文");for c in s.chars(){println!("{}", c);}// 取单个字符let s = String::from("EN中文");let a = s.chars().nth(2); // Some('中')println!("{:?}", a); // 按索引截取字符串 不推荐 遇到中文有问题let s = String::from("EN中文"); let sub = &s[0..2]; // EN// let sub = &s[0..3]; // 报错了println!("{}", sub);}

61. hashmap

use std::collections::HashMap;fn main(){// 映射表操作let mut map = HashMap::new();map.insert("color", "red");map.insert("size", "10 m^2");println!("{}", map.get("color").unwrap());// 遍历映射表操作for p in map.iter(){println!("{:?}", p);/*("color", "red")("size", "10 m^2")*/}// 先判断key是否存在,然后才安全插入map.entry("color").or_insert("red");let mut map = HashMap::new();map.insert(1, "a");// 在已经确定有某个键的情况下直接修改对应的值if let Some(x) = map.get_mut(&1){*x = "b";}for p in map.iter(){println!("{:?}", p);}// (1, "b")}

62. 面向对象

second.rs

pub struct ClassName{field: i32,
}impl ClassName{pub fn new(value: i32)->ClassName{ClassName{field: value}}pub fn public_method(&self){println!("from public method");self.private_method();}fn private_method(&self){println!("from private method");}}

main.rs

mod second;
use second::ClassName;fn main(){let object = ClassName::new(1024);object.public_method();}

63. 并发编程1

use std::thread;
use std::time::Duration;fn spawn_function(){for i in 0..5{println!("spawned thread print {}", i);thread::sleep(Duration::from_millis(1));}
}fn main(){thread::spawn(spawn_function);for i in 0..3{println!("main thread print {}", i);thread::sleep(Duration::from_millis(1));}
}

64. 并发编程2 匿名函数

use std::thread;
use std::time::Duration;fn main(){// 闭包是可以保存进变量或作为参数传递给其他函数的匿名函数。闭包相当于 Rust 中的 Lambda 表达式,格式如下:/**|参数1, 参数2, ...| -> 返回值类型 {// 函数体}*/thread::spawn(||{for i in 0..5 {println!("spawned thread print {}", i);thread::sleep(Duration::from_millis(1));}});for i in 0..3 {println!("main thread print {}", i);thread::sleep(Duration::from_millis(1));}}

65. 匿名函数与参数传递

fn main(){// 匿名函数与参数传递let inc = |num: i32|->i32{num + 1};println!("inc(5) = {}", inc(5));let inc = |num|{num + 1};println!("inc(5) = {}", inc(5));}

66. 守护线程

use std::thread;
use std::time::Duration;// join 方法可以使子线程运行结束后再停止运行程序。
fn main(){let handle = thread::spawn(||{for i in 0..5{println!("spawned thread print {}", i);thread::sleep(Duration::from_millis(1));}});for i in 0..3{println!("main thread print {}", i);thread::sleep(Duration::from_millis(1));}handle.join().unwrap();/*main thread print 0spawned thread print 0main thread print 1spawned thread print 1spawned thread print 2main thread print 2spawned thread print 3spawned thread print 4*/}

67. 使用move进行所有权迁移

使用move让子线程访问主线程变量

use std::thread;fn main() {let s = "hello";let handle = thread::spawn(move || {println!("{}", s);});handle.join().unwrap();
}

68. 主线程与子线程之间的消息收发

// 消息传递
use std::thread;
use std::sync::mpsc;fn main(){let (tx, rx) = mpsc::channel();thread::spawn(move||{let val = String::from("hi");tx.send(val).unwrap();});let received = rx.recv().unwrap();println!("Got: {}", received);}

相关文章:

Rust的入门篇(下)

这篇博客是rust入门篇下 45. 生命周期注释 // 生命周期// 下面代码不能通过编译 // longer 函数取 s1 和 s2 两个字符串切片中较长的一个返回其引用值 // 返回值引用可能会返回过期的引用 // fn longer(s1: &str, s2: &str) -> &str { // if s2.len() >…...

PYTHON-logging-工具类-支持中文字符控制台输出和文件写入-不会导致乱码

import logging import sys import os import time from logging.handlers import RotatingFileHandler import iodef get_logger(tag):# 创建一个新的输出流&#xff0c;并指定编码为UTF-8sys.stdout io.TextIOWrapper(sys.stdout.buffer, encodingutf-8)accPath logsif not…...

对gpt的简单认识

1.gpt是什么&#xff1f; GPT&#xff08;Generative Pre-trained Transformer 生成式预训练Transformer模型&#xff09;是一种基于Transformer架构的预训练语言模型&#xff0c;由OpenAI开发。GPT模型以无监督学习的方式使用大规模语料库进行预训练&#xff0c;并具有生成文…...

java类和对象详解(1)

面向对象的初步认知 什么是面向对象 Java是一门纯面向对象的语言(Object Oriented Program, 简称OOP),在面向对象的世界里&#xff0c;一切皆为对象。面向对象是解决问题的一种思想&#xff0c;主要依靠对象之间的交互完成一件事情。 用面向对象的思想来涉及程序&#xff0c;更…...

RxJava 倒计时,轮询器

笔记 倒计时 /*** 短信倒计时** param s*/private Subscription subscription30;public void startCountdownFinishRx30(int s) {clearFinishSubscription30();subscription30 Observable.interval(0, 1, TimeUnit.SECONDS).take(s 1).map(new Func1<Long, Long>() {O…...

SE-Net注意力机制

📌本次任务:了解SE-Net原理 SE-Net 是 ImageNet 2017(ImageNet 收官赛)的冠军模型,是由WMW团队发布。具有复杂度低,参数少和计算量小的优点。且SENet 思路很简单,很容易扩展到已有网络结构如 Inception 和 ResNet 中。(这篇论文是2019年的,应该是后续做了更新) 一…...

【Lua学习笔记】Lua进阶——垃圾回收

按照唐老师的课程本来要讲自带库的&#xff0c;但是想想这东西能看文档&#xff0c;ctrl左键还能看注解&#xff0c;并且最重要的许多自带库的方法基本大部分语言都有&#xff0c;其实看看就能懂了。所以还是重点讲讲垃圾回收 文章目录 GC辅助垃圾回收collectgarbage增量模式分…...

session和cookie

cookie和session结合使用 web开发发展至今&#xff0c;cookie和session的使用已经出现了一些非常成熟的方案。在如今的市场或者企业里&#xff0c;一般有两种存储方式&#xff1a; 1、存储在服务端&#xff1a;通过cookie存储一个session_id&#xff0c;然后具体的数据则是保…...

P7243 最大公约数

题目 思路 利用曼哈顿原理求离&#xff08;x&#xff0c;y&#xff09;最远的点 代码 #include<bits/stdc.h> using namespace std; #define int long long #define INF 0x3f3f3f3f const int maxn2005; int gcd(int a,int b) { return b?gcd(b,a%b):a; } int n,m; i…...

ES6基础知识九:你是怎么理解ES6中Module的?使用场景?

一、介绍 模块&#xff0c;&#xff08;Module&#xff09;&#xff0c;是能够单独命名并独立地完成一定功能的程序语句的集合&#xff08;即程序代码和数据结构的集合体&#xff09;。 两个基本的特征&#xff1a;外部特征和内部特征 外部特征是指模块跟外部环境联系的接口…...

TensorFlow项目练手(三)——基于GRU股票走势预测任务

项目介绍 项目基于GRU算法通过20天的股票序列来预测第21天的数据&#xff0c;有些项目也可以用LSTM算法&#xff0c;两者主要差别如下&#xff1a; LSTM算法&#xff1a;目前使用最多的时间序列算法&#xff0c;是一种特殊的RNN&#xff08;循环神经网络&#xff09;&#xf…...

微信小程序页面传值为对象[Object Object]详解

微信小程序页面传值为对象[Object Object]详解 1、先将传递的对象转化为JSON字符串拼接到url上2、在接受对象页面进行转译3、打印结果 1、先将传递的对象转化为JSON字符串拼接到url上 // info为对象 let stationInfo JSON.stringify(info) uni.navigateTo({url: /pages/statio…...

Redis篇

文章目录 Redis-使用场景1、缓存穿透2、缓存击穿3、缓存雪崩4、双写一致5、Redis持久化6、数据过期策略7、数据淘汰策略 Redis-分布式锁1、redis分布式锁&#xff0c;是如何实现的&#xff1f;2、redisson实现的分布式锁执行流程3、redisson实现的分布式锁-可重入4、redisson实…...

Entity Framework(EF)查询

一、In 查询 var list = dbContext.Users.Where(u => new int[] {1, 2, 3, 5,...

使用Pytest生成HTML测试报告

背景 最近开发有关业务场景的功能时&#xff0c;涉及的API接口比较多&#xff0c;需要自己模拟多个业务场景的自动化测试&#xff08;暂时不涉及性能测试&#xff09;&#xff0c;并且在每次测试完后能够生成一份测试报告。 考虑到日常使用Python自带的UnitTest&#xff0c;所…...

DSA之图(4):图的应用

文章目录 0 图的应用1 生成树1.1 无向图的生成树1.2 最小生成树1.2.1 构造最小生成树1.2.2 Prim算法构造最小生成树1.2.3 Kruskal算法构造最小生成树1.2.4 两种算法的比较 1.3 最短路径1.3.1 两点间最短路径1.3.2 某源点到其他各点最短路径1.3.3 Dijkstra1.3.4 Floyd 1.4 拓扑排…...

[SQL挖掘机] - 窗口函数 - row_number

介绍: row_number() 是一种常用的窗口函数&#xff0c;它为结果集中的每一行分配一个唯一的数字。这个数字的分配基于指定的排序顺序&#xff0c;并且不会跳过相同的排名。 用法: row_number() 函数的语法如下&#xff1a; row_number() over ([partition by 列名1, 列名2,…...

【论文阅读】通过解缠绕表示学习提升领域泛化能力用于主题感知的作文评分

摘要 本文工作聚焦于从领域泛化的视角提升AES模型的泛化能力&#xff0c;在该情况下&#xff0c;目标主题的数据在训练时不能被获得。本文提出了一个主题感知的神经AES模型&#xff08;PANN&#xff09;来抽取用于作文评分的综合的表示&#xff0c;包括主题无关&#xff08;pr…...

二分查找P1873 [COCI2011-2012#5] EKO / 砍树

P1873 [COCI2011-2012#5] EKO / 砍树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 这个题就是给新手练手的&#xff0c;在那个位置上在进行&#xff0c;寻找合适的砍树高度&#xff0c;下面在介绍一个二分查找的模板 int binarySearch(vector<int>& nums, int t…...

【BOOST程序库】正则表达式相关操作

基本概念这里不解释了&#xff0c;代码中详细解释了BOOST程序库中对于正则表达式常用方法的详细用法。 #include <iostream> #include <string>//正则表达式头文件 #include <boost/xpressive/xpressive.hpp>int main() {//声明正则&#xff1a;boost::pres…...

ElasticSearch数据可视化实战:用Kibana快速构建你的第一个Dashboard

ElasticSearch数据可视化实战&#xff1a;用Kibana快速构建你的第一个Dashboard 当你面对海量的ElasticSearch数据时&#xff0c;如何快速提取有价值的信息并直观呈现&#xff1f;Kibana作为Elastic Stack中的可视化利器&#xff0c;能够将复杂的数据转化为一目了然的图表和仪表…...

用Wireshark抓包学LTE:手把手解析开机附着流程中的NAS/RRC消息

用Wireshark抓包学LTE&#xff1a;手把手解析开机附着流程中的NAS/RRC消息 1. LTE信令分析实战环境搭建 工欲善其事&#xff0c;必先利其器。在开始解析LTE信令前&#xff0c;我们需要搭建专业的分析环境。不同于传统教材的理论讲解&#xff0c;我们将从工程师视角构建完整的分…...

一文读懂水面无人艇:每个硬件模块到底负责什么

目录 一、水面无人艇完整系统 二、硬件搭配负责哪些功能 2.1 艇体模块&#xff1a;决定“能不能稳、能不能装、能不能扛风浪” 2.2 动力与航行执行模块&#xff1a;决定“怎么动” 2.3 导航传感器模块&#xff1a;决定“我现在在哪、朝哪、跑多快” 1&#xff09;GPS / 北…...

【深度强化学习】DDPG算法在连续动作空间中的实战解析

1. DDPG算法初探&#xff1a;为什么我们需要它&#xff1f; 第一次接触DDPG&#xff08;Deep Deterministic Policy Gradient&#xff09;算法时&#xff0c;我完全被这个拗口的名字吓到了。但当我真正理解它的设计初衷后&#xff0c;才发现它其实解决了一个非常实际的问题——…...

UE5.3与Colosseum集成配置指南及常见问题解析

1. 环境准备&#xff1a;Windows系统下的基础配置 在开始Colosseum与UE5.3的集成之前&#xff0c;我们需要确保开发环境满足基本要求。我最近在Windows 11系统上完成了一次完整配置&#xff0c;实测下来这几个关键组件版本组合最稳定&#xff1a; 操作系统&#xff1a;Windows …...

软件测试员转型AI测试:机遇与挑战全解析

技术浪潮下的必然选择在人工智能技术席卷全球的浪潮中&#xff0c;软件测试领域正经历前所未有的变革。2026年数据显示&#xff0c;AI在测试行业的渗透率已超40%&#xff0c;新发AI测试岗位量同比增长543%&#xff0c;薪资溢价高达18%。这一趋势迫使测试从业者直面转型抉择&…...

石墨烯这玩意儿在COMSOL里折腾起来挺有意思的,特别是搞太赫兹和近红外的同学估计都遇到过选模型的纠结。今天咱们就聊点实战经验,顺便甩点代码片段

Comsol石墨烯二维材料。 包含太赫兹德鲁得和近红外Kubo两种模型。 共7个案例&#xff0c;包含参考文献。先说说太赫兹波段常用的德鲁得模型&#xff0c;这货相当于把石墨烯当经典等离子体处理。在COMSOL里实现时&#xff0c;关键要设置表面电流密度&#xff1a; sigma_drude (…...

从CISCN2019华北赛区Web1看SQL注入的巧妙绕过技巧

1. 从CISCN2019华北赛区Web1看SQL注入的巧妙绕过技巧 在CTF比赛中&#xff0c;Web安全题目常常会设置各种过滤规则来阻止常见的攻击手法。CISCN2019华北赛区的Web1题目"Hack World"就是一个典型的例子&#xff0c;它通过组合过滤的方式限制了传统SQL注入手段。这道题…...

OpenClaw配置备份指南:GLM-4.7-Flash环境快速迁移方案

OpenClaw配置备份指南&#xff1a;GLM-4.7-Flash环境快速迁移方案 1. 为什么需要环境迁移&#xff1f; 上周我的主力开发机突然硬盘故障&#xff0c;导致精心配置的OpenClaw环境全部丢失。重装后发现要重新对接GLM-4.7-Flash模型、配置飞书通道、安装十几个自定义技能——这个…...

OpenClaw跨平台部署:nanobot镜像在mac/Windows双系统实测

OpenClaw跨平台部署&#xff1a;nanobot镜像在mac/Windows双系统实测 1. 为什么选择nanobot镜像 第一次听说nanobot这个轻量级OpenClaw镜像时&#xff0c;我正被本地部署大模型的资源消耗问题困扰。作为一个经常在macOS和Windows双系统切换的开发者&#xff0c;我需要一个能在…...