100个练习学习Rust!if・Panic・演练
之前的文章
【0】准备
【1】构文・整数・变量 ← 上回
【2】 if・Panic・演练 ← 本次
这是“100 Exercise To Learn Rust”的第2次练习!本次的主题包括 if 表达式、panic 机制,以及对前面内容的总结练习。
本次相关的页面如下:
- 2.3. Branching: if/else
- 2.4. Panics
- 2.5. Factorial
[02_basic_calculator/03_if_else] if式
- 2.3. Branching: if/else
问题如下:
/// Return `true` if `n` is even, `false` otherwise.
fn is_even(n: u32) -> bool {todo!()
}#[cfg(test)]
mod tests {use crate::is_even;#[test]fn one() {assert!(!is_even(1));}#[test]fn two() {assert!(is_even(2));}#[test]fn high() {assert!(!is_even(231));}
}
要求返回 n 是偶数时为 true,n 是奇数时为 false。
解释
如果忘记这是在用 Rust,而是直接使用 if
来编写的话,可能会像这样写吧?
fn is_even(n: u32) -> bool {let result;if n % 2 == 0 {result = true;} else {result = false;}return result;
}
不过,这段源码实在让人忍不住想吐槽很多地方。正好借此机会,我们可以尝试使用一个叫 Clippy 的 linter 工具。
cargo clippy
Checking if_else v0.1.0 (/path/to/100-exercises-to-learn-rust/exercises/02_basic_calculator/03_if_else)
warning: function `is_even` is never used--> exercises/02_basic_calculator/03_if_else/src/lib.rs:2:4|
2 | fn is_even(n: u32) -> bool {| ^^^^^^^|= note: `#[warn(dead_code)]` on by defaultwarning: unneeded `return` statement--> exercises/02_basic_calculator/03_if_else/src/lib.rs:11:5|
11 | return result;| ^^^^^^^^^^^^^|= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_return= note: `#[warn(clippy::needless_return)]` on by default
help: remove `return`|
11 - return result;
11 + result|warning: unneeded late initialization--> exercises/02_basic_calculator/03_if_else/src/lib.rs:3:5|
3 | let result;| ^^^^^^^^^^^|= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_late_init= note: `#[warn(clippy::needless_late_init)]` on by default
help: declare `result` here|
5 | let result = if n % 2 == 0 {| ++++++++++++
help: remove the assignments from the branches|
6 ~ true
7 | } else {
8 ~ false|
help: add a semicolon after the `if` expression|
9 | };| +warning: this if-then-else expression assigns a bool literal--> exercises/02_basic_calculator/03_if_else/src/lib.rs:5:5|
5 | / if n % 2 == 0 {
6 | | result = true;
7 | | } else {
8 | | result = false;
9 | | }| |_____^ help: you can reduce it to: `result = n % 2 == 0;`|= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_bool_assign= note: `#[warn(clippy::needless_bool_assign)]` on by defaultwarning: `if_else` (lib) generated 4 warnings (run `cargo clippy --fix --lib -p if_else` to apply 2 suggestions)Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.10s
第一个警告:function 'is_even' is never used 可以忽略。
关于 unneeded 'return' statement
: 由于 Rust 是一种面向表达式的语言,函数最后的 return
是不必要的。
关于 unneeded late initialization
: 同样地,由于 Rust 是面向表达式的语言,if
结构也是一个表达式(在练习中有解释),因此不需要在各个分支中对 result
进行初始化。
综上所述(忽略最后一个警告),代码可以改成这样!
fn is_even(n: u32) -> bool {if n % 2 == 0 {true} else {false}
}
由于 if
是一个表达式,因此可以将返回值直接绑定到 result
上(冗长的写法已折叠)。
但其实我们可以注意到,函数会返回最后被计算的值,因此根本不需要绑定到 result
。
总结来说,上述代码中,函数的返回值将是 if
表达式的计算结果,从而正确返回了 n
的偶数或奇数判定!
$ cargo clippyChecking if_else v0.1.0 (/path/to/100-exercises-to-learn-rust/exercises/02_basic_calculator/03_if_else)
warning: function `is_even` is never used--> exercises/02_basic_calculator/03_if_else/src/lib.rs:2:4|
2 | fn is_even(n: u32) -> bool {| ^^^^^^^|= note: `#[warn(dead_code)]` on by defaultwarning: this if-then-else expression returns a bool literal--> exercises/02_basic_calculator/03_if_else/src/lib.rs:3:5|
3 | / if n % 2 == 0 {
4 | | true
5 | | } else {
6 | | false
7 | | }| |_____^ help: you can reduce it to: `n % 2 == 0`|= help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#needless_bool= note: `#[warn(clippy::needless_bool)]` on by defaultwarning: `if_else` (lib) generated 2 warnings (run `cargo clippy --fix --lib -p if_else` to apply 1 suggestion)Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.12s
fn is_even(n: u32) -> bool {n % 2 == 0
}
其实根本不需要 if
表达式啊...!我以为是 if
表达式的问题,所以陷入了先入为主的思维...
顺便说一下,模范解答里也没有用 if
表达式。这是故意设计成这样的题目吗?
在这种时候,Clippy 真是太伟大了...!
[02_basic_calculator/04_panics] Panic
- 2.4. Panics
这是问题的内容。虽然有点长,但因为包含了解题所需的信息,所以连测试部分也一起提供了。
/// Given the start and end points of a journey, and the time it took to complete the journey,
/// calculate the average speed of the journey.
fn speed(start: u32, end: u32, time_elapsed: u32) -> u32 {// TODO: Panic with a custom message if `time_elapsed` is 0(end - start) / time_elapsed
}#[cfg(test)]
mod tests {use crate::speed;#[test]fn case1() {assert_eq!(speed(0, 10, 10), 1);}#[test]// 👇 With the `#[should_panic]` annotation we can assert that we expect the code// under test to panic. We can also check the panic message by using `expected`.// This is all part of Rust's built-in test framework!#[should_panic(expected = "The journey took no time at all, that's impossible!")]fn by_zero() {speed(0, 10, 0);}
}
首先,前提是 speed 函数在出现除以 0 的情况时会发生 panic。这本身没有问题,但在这种情况下,希望输出测试中指定的自定义消息:The journey took no time at all, that's impossible!
Rust Playground
Rust Playground
Exercises 中介绍了这个工具,所以我也在这里介绍一下。Rust Playground 是一个类似 Wandbox、ideone、TS playground的在线编辑器,但专门用于 Rust。
和 Wandbox 一样,它可以通过永久链接分享源代码,因此在不创建项目时快速检查语法,或者在社交媒体上讨论 Rust 时都非常方便。一定要试试哦!
解释
如果 time_elapsed == 0
,我们可以预先触发 panic,并输出想要显示的消息。这可以通过 if
表达式和 panic!
宏来实现。(这个问题才是更适合用 if
的场景吧?)
fn speed(start: u32, end: u32, time_elapsed: u32) -> u32 {// TODO: Panic with a custom message if `time_elapsed` is 0if time_elapsed == 0 {panic!("The journey took no time at all, that's impossible!");}(end - start) / time_elapsed
}
这段话可以翻译为:
顺便提一下,在这种情况下,使用 assert_*
系列宏会很方便!因为我们想确认 time_elapsed != 0
,所以这次可以使用assert_ne宏。
fn speed(start: u32, end: u32, time_elapsed: u32) -> u32 {// TODO: Panic with a custom message if `time_elapsed` is 0assert_ne!(time_elapsed, 0,"The journey took no time at all, that's impossible!");(end - start) / time_elapsed
}
这段话可以翻译为:
assert_*
系列宏可以理解为“保证条件被满足”,这样理解起来会更容易。
assert_eq
: 保证第一个参数和第二个参数相等,如果不相等就会触发 panic。assert_ne
: 保证第一个参数和第二个参数不相等,如果相等就会触发 panic。
这些宏如果不熟悉,确实容易混淆。此外,第三个参数可以指定 panic 时的自定义消息,因此可以在这里传入测试中要求的文本。
虽然在行数上使用 if
和 assert_*
宏区别不大(甚至可能多一行),但因为能传达“保证”的含义,所以可能有一部分人会觉得这种写法更易读。
问:听说使用 Result 类型更好是吗?
答:是的。在这种可能会出现错误的情况下,与其直接引发 panic,不如使用程序可以自定义错误处理的 Result 类型更为理想。(据说在 “100 Exercises” 中期会介绍这个概念。)
虽然在不熟悉的情况下尽可能使用 Result 类型确实不会出错,但理想情况下,我们也应该学习如何在合适的场景下使用 panic。以下是一些适合使用 panic(也就是 unwrap 系方法)的情况。
在编译时已确定值且不可能发生 panic 的情况下
使用 unwrap反而会让代码更易读。在
main
函数的开头读取环境变量或依赖文件时
使用 Result 进行分支处理往往显得冗长。在这种情况下,使用 expect会是个不错的选择。一般来说,Result 类型适用于处理用户输入等“在运行时未确定输入”的情况。考虑到大多数程序都涉及这样的场景(尽管这有些偏见),所以使用 Result 类型的情况会更多。
[02_basic_calculator/05_factorial] 尝试编写函数
- 2.5. Factorial
问题是...除了测试部分之外,只有注释,所以我将注释内容总结如下:
请定义一个接收非负整数 n
的函数 factorial
,并返回 n
的阶乘(n!
)。
阶乘是从 1 到 n
的所有正整数的乘积。例如:5! = 5 * 4 * 3 * 2 * 1 = 120
。0!
定义为 1。factorial(0)
应返回 1,factorial(1)
也应返回 1,factorial(2)
应返回 2...依此类推。
请使用到目前为止所学的内容。你还没有学到循环,所以请使用递归来实现!
问题:
// Define a function named `factorial` that, given a non-negative integer `n`,
// returns `n!`, the factorial of `n`.
//
// The factorial of `n` is defined as the product of all positive integers up to `n`.
// For example, `5!` (read "five factorial") is `5 * 4 * 3 * 2 * 1`, which is `120`.
// `0!` is defined to be `1`.
//
// We expect `factorial(0)` to return `1`, `factorial(1)` to return `1`,
// `factorial(2)` to return `2`, and so on.
//
// Use only what you learned! No loops yet, so you'll have to use recursion!#[cfg(test)]
mod tests {use crate::factorial;#[test]fn first() {assert_eq!(factorial(0), 1);}#[test]fn second() {assert_eq!(factorial(1), 1);}#[test]fn third() {assert_eq!(factorial(2), 2);}#[test]fn fifth() {assert_eq!(factorial(5), 120);}
}
确实,我们在 Rust 里还没学到循环,但就这么直接用递归真的好吗……算了,没关系。
解释
只需要写一个用于终止递归的保护条件,以及一个用于递归求值的部分就行了。
fn factorial(n: u32) -> u32 {if n == 0 {return 1;}n * factorial(n - 1)
}
这道题作为到目前为止问题的总结是很合适的。
-
语法
通过定义函数的形式复习了之前的内容。 -
非负整数
将类型设为u32
后,就不必担心传入负数作为参数,因此不需要额外的异常处理。 -
变量
以函数参数的形式出现。 -
if
表达式和 Panic
如果传入0
作为参数,执行n - 1
会引发 panic,但因为有保护条件阻止了这种情况的发生,所以没有问题。
虽然在我的写法中没有使用表达式,但模范解答似乎要求对表达式有一定的理解。
回顾这道题,发现它设计得相当好,让人惊讶。
总结
虽然还没涉及到循环等更高级的语法,但最后这个问题确实相当有趣。
那么,让我们进入下一个问题吧!
下一篇文章: 【3】可变性・循环・溢出
相关文章:
100个练习学习Rust!if・Panic・演练
之前的文章 【0】准备 【1】构文・整数・变量 ← 上回 【2】 if・Panic・演练 ← 本次 这是“100 Exercise To Learn Rust”的第2次练习!本次的主题包括 if 表达式、panic 机制,以及对前面内容的总结练习。 本次相关的页面如下: 2.3. Bran…...
MODELSIM仿真报错解决记录
目录 问题:Modelsim报错:Error (10228): Verilog HDL error at Line_Shift_RAM_1Bit.v(39): module “Line_Shift_RAM_1 原因:创建的IP核放到了别的位置 解决方法:删掉IP核以及QIP等文件,将IP核创建到工程目录下 问…...
day33-负载均衡实战
01.问题总结 1.rsync同步注意目录加/和不加/的区别 2.安装wordpress过程中禁止使用IP安装,解析成域名安装 比如安装过程 10.0.0.7--->填写数据库信息--->写入数据库中 如果安装完成后再使用www.wp.com访问,不能访问页面乱码的问题。 3.挂载wordpress挂载uplo…...
网络接口 eno1 未连接或未托管
网络接口 eno1 未连接或未托管,通常意味着该接口没有被识别或没有被配置为自动连接到网络。以下是一些可能的解决方案: 检查物理连接: 确保您的以太网电缆正确连接到 eno1 接口和调制解调器/路由器。 启用网络接口: 使用以下命令…...
Linux I/O 多路复用机制详解
文章目录 1 文件描述符(File Descriptor)1.1 什么是文件描述符?1.2 文件描述符与文件的关系 2 文件描述符集合(File Descriptor Set)2.1 什么是文件描述符集合?2.2 fd_set 结构体 3 select() 函数的工作原理…...
第43课 Scratch入门篇:雪花随风飘
雪花随风飘 故事背景: 雪花轻轻地从灰蒙蒙的天空中飘落下来,它们像是天空中飘洒下来的羽毛,又像是冬日的精灵在翩翩起舞。每一片雪花都独一无二,它们在空中旋转、飘荡,最终缓缓降落在屋顶、树枝、街道和行人的肩头。 程序原理: 众多的雪花肯定是克隆功能,降落过程是通过…...
VueUse 基于 Vue 3 Composition API 的高质量 Hooks 库
VueUse 是什么? VueUse 是基于 Vue 3 Composition API 的高质量 Hooks 库。例如获取滚动的距离 VueUse 官网:VueUse | VueUse VueUse 什么使用? 1、通过npm安装 VueUse npm i @vueuse/core 2、搜索需要使用的函数,例如搜索 useScroll 滚动 3、使用useScroll 滚动函数 …...
ARM CoreLink 系列 5.1.1 -- CI-700 System Address Map 】
文章目录 System Address MapRN SAMRN SAM memory regions and target typesSAM memory region size configurationRN SAM target ID selectionSystem Address Map 所有的CHI 命令都包含一个 Source ID 和 Target ID, 其中 Source ID 可以来自于 RN Node, Target ID 可以来自…...
【数据结构】二叉树(一)
目录 1. 树型结构 概念 树的表示形式 编辑 2. 二叉树(重点) 2.1 概念 2.2 二叉树的性质 2.3 二叉树的存储 2.4 二叉树的遍历 前中后序遍历 层序遍历: 2.5二叉树的基本操作 本篇主要理解树和二叉树相关概念,二叉树遍…...
使用duplicate搭建备库或者级联备库
使用duplicate搭建备库或者级联备库: 主库或者源端: 1. 创建pfile,更改&添加部分参数、传输到备库; 2. 主库(或者源端)的tnsnames.ora文件添加 备库的连接信息 备库: 1. 备库添加静态监听 2…...
【存储学习笔记】4:快照(Snapshot)技术的实现方式
1 快照 1.1 动机 在上一篇《备份》里提到,热备份就是在执行操作时,服务器需要正常处理来自用户或应用对数据的更新,这样能够保证数据7*24小时可用(在很多服务里这是必要的)。 而热备份的困难就是如何保证数据的一致…...
数根(字符串数根公式)
公式:a的数根(a-1)%91; #include <bits/stdc.h> using namespace std; string s; long long sum; int main(){cin>>s;for(int i0;i<s.size();i){sums[i]-0;}cout<<(sum-1)%91; }...
C语言之文件操作上卷(二十一)(逆行人生-2024)
📣📣📣📣📣📣📣📣 ✏️作者主页:枫霜剑客 📋 系列专栏:C语言知识学习归纳总结(逐梦篇专栏合集) 🌲上一篇: C语…...
【微服务架构实战】结合实际案例进行微服务架构的设计与实现
微服务架构实战 结合实际案例进行微服务架构的设计与实现 引言 微服务架构(Microservices Architecture)是一种将大型应用程序拆分成一组小型、独立的服务的方法,每个服务都专注于特定的业务功能,并能够独立开发、部署和扩展。这…...
为什么要有二级指针
提示:文章 文章目录 前言一、背景二、 2.1 2.2 总结 前言 前期疑问: 本文目标: 一、背景 之前一直疑问为什么要有二级指针,一直没有写这个帖子,今天整理了一下,收获颇丰 二、 2.1 // 增加对二级指针…...
如何保证数据不丢失?(死信队列)
死信队列 1、什么是死信 死信通常是消息在特定的场景下表现: 消息被拒绝访问消费者发生异常,超过重试次数消息的Expiration过期时长或者队列TTL过期时间消息队列到达最大容量 maxLength 2、什么是死信队列 只由死信构成的消息队列是死信队列 死信队…...
树莓派开发笔记01-树莓派的系统烧录以及初次开机配置
github主页:https://github.com/snqx-lqh gitee主页:https://gitee.com/snqx-lqh 本项目github地址:https://github.com/snqx-lqh/RaspberryPiLearningNotes 本项目gitee地址:https://gitee.com/snqx-lqh/RaspberryPiLearningNote…...
微信答题小程序产品研发-后端开发
在开发答题小程序的后端服务和数据库设计时,需要考虑API的设计、数据库模型的构建以及数据的安全性和一致性。 这里我采用了云开发,后端语言是Node,数据库是NoSql,然后我简单整理了各个功能模块的后端开发概要和数据库设计。 1. …...
回溯算法——LeetCode37 解数独
题目 力扣题目链接 思路 卡哥的思路,注意看他解释为什么是“二维回溯”。我的思路,类似y总解决 N 皇后问题时的第二种方法,即从左上到右下枚举棋盘的每个位置。 至于为什么与 N 皇后问题不一样,我认为是因为它每一行不止放一个…...
【CPP】继承语法详解与菱形继承
关于我: 睡觉待开机:个人主页 个人专栏: 《优选算法》《C语言》《CPP》 生活的理想,就是为了理想的生活! 作者留言 PDF版免费提供:倘若有需要,想拿我写的博客进行学习和交流,可以私信我将免费提供PDF版。…...
数据结构(6.2_1)——领接矩阵法
图的存储——邻接矩阵法 邻接矩阵(Adjacency Matrix)是一种使用二维数组来表示图的方法。在这种表示法中,矩阵的行和列都对应图的顶点。 特点 对于无向图,如果顶点i与顶点j之间有边,则矩阵的第i行第j列(…...
诈骗未成功是否构成犯罪?
诈骗未成功不一定构成犯罪。在刑法上,构成诈骗罪需要满足特定的构成要件,包括有非法占有的目的、实施了虚构事实或隐瞒真相的行为、对方因此陷入错误认识并处分财产、行为人或第三方取得财产、被害人遭受财产损失。如果诈骗行为未能成功,即被…...
网络协议栈应用层的意义(内含思维导图和解析图通俗易懂超易理解)
绪论: “节省时间的方法就是全力以赴的将所要做的事情完美快速的做完,不留返工重新学习的时间,才能省下时间给其他你认为重要的东西。” 本章主要讲到OSI网络协议栈中的应用层的作用和再次在应用层的角度理解协议的具体意义,以及…...
【NXP-MCXA153】i2c驱动移植
介绍 I2C总线由飞利浦公司开发,是一种串行单工通信总线,它主要用于连接微控制器和其他外围设备并在总线上的器件之间传送信息(需要指定设备地址);常见的i2c设备有EEPROM、触摸屏、各种IoT传感器、时钟模块等&#x…...
C++(11)类语法分析(2)
C(10)之类语法分析(2) Author: Once Day Date: 2024年8月17日 一位热衷于Linux学习和开发的菜鸟,试图谱写一场冒险之旅,也许终点只是一场白日梦… 漫漫长路,有人对你微笑过嘛… 全系列文章可参考专栏: 源码分析_Once-Day的博客-CSDN博客 …...
数字验证每日十问--(3)
深拷贝和浅拷贝的区别? 当只拷贝对象中的成员变量和声明的句柄时,称为浅拷贝。浅拷贝只把对象中的句柄复制了,却没有复制句柄b所指向的对象。这会导致复制后,a2中的句柄b 和 a1 中的句柄b指向同一个对象,如果a2中的句…...
22.给定 n 对括号,实现一个算法生成所有可能的正确匹配的括号组合
22. Generate Parentheses 题目 给定 n 对括号,编写一个函数生成所有可能的正确匹配的括号组合。 例如,当 n = 3 时,可能的组合集合为: ["((()))","(()())","(())()","()(())","()()()" ]题目大意 给出 n 代表生成…...
检测到目标URL存在http host头攻击漏洞
漏洞描述 修复措施 方法一: nginx 的 default_server 指令可以定义默认的 server 去处理一些没有匹配到 server_name 的请求,如果没有显式定义,则会选取第一个定义的 server 作为 default_server。 server { …...
C++奇迹之旅:手写vector模拟实现与你探索vector 容器的核心机制与使用技巧
文章目录 📝基本框架🌠 构造和销毁🌉vector()🌉vector(const vector& v)🌉vector(size_t n, const T& value T())🌉赋值拷贝构造:vector<T>& operator(vector<T> v)&a…...
018、钩子函数 mounted和beforeDestroy、父组件向子组件传递参数 props 的使用
文章目录 1、mounted 和 beforeDestroy1.1、mounted1.2、beforeDestroy 2、父组件向子组件传递参数 props2.1、子组件定义2.2、父组件调用子组件并传参 3、完整例子3.1、父组件 Tags.vue3.2、子组件 TagsMenu.vue3.3、效果图 1、mounted 和 beforeDestroy 1.1、mounted mount…...
xlnt在Windows中的dll,lib生成
前言 花了半天时间想要把xlnt 集成到VS2022 Cmake项目中,以我目前掌握的能力,Cmake语法对于我来说难懂,对于只是使用过Cmake编译MySQL,或是其他lib,dll库的小白来说,不应该为了显示自己能力多么出众,强行去配置一些程序内容。 生活中没有绝对的事情,有舍有得. https://github…...
【网络】私有IP和公网IP的转换——NAT技术
目录 引言 NAT工作机制编辑 NAT技术的优缺点 优点 缺点 个人主页:东洛的克莱斯韦克-CSDN博客 引言 公网被子网掩码划分为层状结构,一个公网IP的机器又可以用很多私有IP搭建内网。在日常生活场景中用的都是私有IP,例如手机,…...
java 面试 PDF 资料整理
“尊贵的求知者,作者特此献上精心编纂的Java面试宝典PDF,这份资料凝聚了无数面试精华与实战经验,是通往Java技术殿堂的钥匙。若您渴望在Java编程的求职之路上稳健前行,只需轻轻一点,完成这象征支持与认可的一键三联&am…...
初步认识Linux系统
前言 Linux系统具有许多优点,不仅系统性能稳定,而且是开源软件。其核心防火墙组件性能高效、配置简单,保证了系统的安全。在很多企业网络中,为了追求速度和安全,Linux不仅仅是被网络运维人员当作服务器使用,…...
JavaScript AI 编程助手
JavaScript AI 编程助手 引言 随着人工智能技术的飞速发展,编程领域也迎来了前所未有的变革。JavaScript,作为全球最流行的编程语言之一,其与AI的结合为开发者带来了巨大的便利和无限的可能性。本文将探讨JavaScript AI编程助手的定义、功能…...
达梦数据库的系统视图v$datafile
达梦数据库的系统视图v$datafile 达梦数据库的V$DATAFILE 是一个重要的系统视图,提供了有关数据库数据文件的信息。 V$DATAFILE 系统视图 V$DATAFILE 视图用于显示数据库中每一个数据文件的详细信息。通过查询这个视图,数据库管理员可以了解数据文件的…...
Triton/window安装: triton-2.0.0-cp310-cp310-win_amd64.whl文件
下面这个github仓: https://github.com/PrashantSaikia/Triton-for-Windows/tree/main 安装命令也很简单,下载到本地后运行: pip install triton-2.0.0-cp310-cp310-win_amd64.whl...
应急响应-DDOS-典型案例
某单位遭受DDoS攻击事件如下 事件背景 2019年2月17日,某机构门户网站无法访问,网络运维人员称疑似遭受DDoS攻击,请求应急响应工程师协助。 事件处置 应急响应工程师在达到现场后,通过查看流量设备,发现攻击者使用僵…...
JAVA学习之知识补充(下)
六:File类与IO流: 这里给出三种常见的初始化方法: 通过文件路径初始化: File file new File("C:/example/test.txt");这种方法用于创建一个文件对象,该文件对象表示指定路径的文件或目录。例如:File fil…...
qt生成一幅纯马赛克图像
由于项目需要,需生成一幅纯马赛克的图像作为背景,经过多次测试成功,记录下来。 方法一:未优化方法 1、代码: #include <QImage> #include <QDebug> #include <QElapsedTimer>QImage generateMosa…...
python循环——九九乘法表(更加轻松的理解循环结构)
感受 首先,得明确意识到这个问题,就是我的循环结构学的一塌糊涂,完全不能很好的使用这个循环来实现各种九九乘法表达输出,这样的循环结构太差了,还需要我自己找时间来补充一下循环的使用,来拓宽自己的思考方…...
UDS诊断系列之十八故障码的状态掩码
在谈19服务的子功能之前,先说一下故障码(DTC)的状态掩码是什么。 一、状态掩码 状态掩码由八个状态位构成,客户端利用它向服务器请求与其状态相匹配的DTC信息。当服务器接收到来自客户端的请求时,它会通过过滤匹配的…...
【jvm】直接引用
目录 1. 说明2. 形式3. 特点4. 生成过程5. 作用 1. 说明 1.在Java虚拟机(JVM)中,直接引用(Direct Reference)是相对于符号引用(Symbolic Reference)而言的,它是指向内存中实际存在的…...
PythonStudio 控件使用常用方式(二十七)TActionList
PythonStudio是一个极强的开发Python的IDE工具,官网地址是:https://glsite.com/ ,在官网可以下载最新版的PythonStudio,同时,在使用PythonStudio时,它也能及时为用户升到最新版本。它使用的是Delphi的控件&…...
PDF 转Word 开源库
1. Apache PDFBox Apache PDFBox 是一个开源的 Java 库,用于创建和操作 PDF 文档。虽然 PDFBox 本身没有直接支持 PDF 转 Word 的功能,但它可以提取 PDF 内容,你可以结合其他方法将这些内容写入 Word。 添加依赖 <dependency><gr…...
Docker - 深入理解Dockerfile中的 RUN, CMD 和 ENTRYPOINT
RUN docker file 中的 RUN 命令相对来教容易理解 RUN 指令用于在构建镜像时执行命令,这些命令会在 Docker 镜像的构建过程中执行。常用于安装软件包、设置环境变量、创建目录等。RUN 指令会在镜像构建中创建新的镜像层,每个 RUN 指令都会创建一个新的镜…...
Python 函数式编程 内置高阶函数及周边【进阶篇 3】推荐
前面我们已经总结并实践了用python获取到了数据。也介绍了python中http网络请求的几种方式,正在学习python开发语言或者对python3知识点生疏需要回顾的请点这里 ,本章主要总结了函数式编程及特点 和 python中内置的高阶函数及周边知识,方便自…...
【Rust光年纪】探秘Rust GUI库:从安装配置到API概览
Rust语言GUI库全方位比较:选择适合你的工具 前言 在现代软件开发中,图形用户界面(GUI)库扮演着至关重要的角色。随着Rust语言的不断发展,越来越多的优秀的GUI库也相继问世,为Rust开发者提供了更多选择。本…...
Element plus部分组件样式覆盖记录
文章目录 一、el-button 样式二、Popconfirm 气泡确认框三、Popover 气泡卡片四、Checkbox 多选框五、Pagination 分页六、Form 表单七、Table 表格 一、el-button 样式 html: <el-button class"com_btn_style">button</el-button>样式覆盖…...
重塑业务生态,Vatee万腾平台:引领行业变革的新引擎
在数字经济浪潮汹涌的今天,传统行业的边界正被不断模糊与重塑,新兴技术如云计算、大数据、人工智能等正以前所未有的速度改变着商业世界的面貌。在这一背景下,Vatee万腾平台应运而生,以其独特的创新模式和强大的技术实力ÿ…...