福田蒙派克6座二手值多少钱/成都网站seo设计
在第一节(20天学rust(一)和rust say hi)我们配置好了rust
的环境,并且运行了一个简单的demo——practice-01
,接下来我们将从示例入手,学习rust
的基础语法。
首先来看下项目结构:
项目结构
practice-01
├── Cargo.lock # Cargo 依赖版本锁定文件
├── Cargo.toml # Cargo 主要设置文件
└── src└── main.rs # Rust 程序入口
项目的重点文件有两个:Cargo.toml
文件和main.rs
。我们首先来看下practice-01
的Cargo.toml
rust的灵魂——Cargo.toml
[package]
name = "practice-01"
version = "0.1.0"
edition = "2021"# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
fast-str = "1.0.0"
其实这里是一个极简的文件,它用于管理项目的依赖项、编译选项和其他配置信息,我们来看下完整的:
[package]
name = "my_project"
version = "0.1.0"
edition = "2018"[dependencies]
crate_name = "version"[dev-dependencies]
dev_crate_name = "version"[build-dependencies]
build_crate_name = "version"[features]
feature_name = ["dependency_name/version"]
[package]
:用于指定包的元数据,包括名称、版本和edition
。名称是包的唯一标识符,版本遵循语义化版本规范,edition
指定Rust
编译器使用的版本。[dependencies]
:用于指定项目的依赖项。每个依赖项由crate
名称和版本号组成,可以通过在=
后面指定版本号或使用特定的版本约束来指定依赖项的版本。[dev-dependencies]
:用于指定只在开发环境中使用的依赖项,例如测试框架或代码检查工具。[build-dependencies]
:用于指定在构建过程中需要的依赖项,例如构建脚本或代码生成工具。[features]
:用于定义项目的特性(features
),特性是一组可选的依赖项,可以通过在=
后面列出依赖项的名称和版本号来指定。
Cargo.toml
文件还可以包含其他配置项,例如构建脚本、路径别名、工作空间设置等。这些配置项可以根据项目的需要进行自定义。
通过编辑和配置Cargo.toml
文件,可以管理Rust
项目的依赖项、版本控制和构建过程。Cargo
工具使用Cargo.toml
文件来构建、测试和发布Rust
项目,使得项目的管理变得简单和方便。
更多信息可以参考rust官网文档:cargo/Cargo.toml
接下来再看main.rs
的代码,我将逐行的解释下面代码
use std::io;fn main() {println!("Hello!");loop {let mut input = String::new();io::stdin().read_line(&mut input).expect("Failed to read input!");if input.contains("quit") {break;}i_say_what_u_say(input)}
}fn i_say_what_u_say(str: String) {print!("{}", str)
}
use std::io;
这里有两个知识点:use
、::
use
在Rust中, use
关键字用于引入一个模块或类型的路径到当前作用域,以便在代码中可以直接使用该模块或类型的名称,而无需每次都写完整的路径。
use
关键字有两种常见的用法:
- 引入模块:可以使用
use
关键字来引入一个模块,以便在当前作用域中直接使用模块中的项(函数、结构体、枚举等)。引入模块的语法是use 模块路径
。
例如,如果想在代码中使用std::io::Result
,可以使用use
关键字引入该模块:
use std::io::Result;
然后就可以在代码中直接使用Result
,而无需写完整的路径std::io::Result
。 - 引入类型:可以使用
use
关键字来引入一个具体的类型,以便在当前作用域中直接使用该类型的名称。引入类型的语法是use 类型路径
。
例如,如果想在代码中使用std::io::Error
,可以使用use
关键字引入该类型:
use std::io::Error;
然后就可以在代码中直接使用Error
,而无需写完整的路径std::io::Error
。
需要注意的是,use
关键字只是将指定的模块或类型的路径引入到当前作用域,并不会导入任何其他的项。如果想要导入模块中的所有项,可以使用use 模块路径::*
的语法。
如果你有Java
或者Go
的经验,理解起来就很容易,它类似于import
的用法。如果不用use
也行,只不过在每次用到的时候都需要写全路径名。
::
在Rust中,::
是一个作用域解析运算符,用于访问模块、结构体、枚举、常量、函数等定义在特定命名空间中的项。
下面是关::
的一些用法和含义:
- 访问模块中的项:
mod my_module {pub fn my_function() {// 函数实现}}// 使用"::"来访问模块中的函数my_module::my_function();
- 访问结构体和枚举中的项:
struct MyStruct {my_field: i32,}// 使用"::"来访问结构体的字段let my_value = MyStruct { my_field: 42 };println!("{}", my_value.my_field);enum MyEnum {Variant,}// 使用"::"来访问枚举的变体let my_variant = MyEnum::Variant;
- 访问常量和函数:
const MY_CONSTANT: i32 = 42;// 使用"::"来访问常量println!("{}", MY_CONSTANT);fn my_function() {// 函数实现}// 使用"::"来访问函数my_function();
需要注意的是,::
并不是一个特定于Rust
的运算符,它在其他编程语言中也有类似的用法。它的作用是帮助标识和访问特定命名空间中的项。
提到了::
,还有个运算符就不得不提:.
。
.
Rust中的 .
运算符用于访问结构体、枚举、模块和其他数据类型的字段、方法和关联常量。
.
运算符用法示例:
struct Person {name: String,age: u32,
}impl Person {fn new(name: &str, age: u32) -> Person {Person {name: name.to_string(),age,}}fn say_hello(&self) {println!("Hello, my name is {}", self.name);}
}fn main() {let person = Person::new("Alice", 25);println!("Name: {}", person.name);println!("Age: {}", person.age);person.say_hello();
}
rust的入口——main函数
fn main()
main是整个程序的入口,也是整个软件的灵魂。这个就不用多说了。
rust里的一等公民——i_say_what_u_say
fn i_say_what_u_say(str: String) {print!("{}", str)
}
这里我们定义了一个函数i_say_what_u_say。在Rust中,函数是一种用于封装可执行代码的基本构建块。以下是关于Rust函数的介绍:
函数定义
在Rust中,函数的定义使用 fn
关键字,后跟函数名称、参数列表和返回类型。函数体由一对花括号 {}
包围,用于包含实际的代码逻辑。
fn add(a: i32, b: i32) -> i32 {let sum = a + b;sum
}
上述代码定义了一个名为 add
的函数,它接受两个 i32
类型的参数 a
和 b
,并返回一个 i32
类型的结果。函数体中计算了 a
和 b
的和,并将其作为函数的返回值。
函数调用
要调用一个函数,只需使用函数名称后跟参数列表,并使用圆括号 ()
包围参数。
let result = add(3, 5);
println!("Result: {}", result);
上述代码调用了之前定义的 add
函数,传递参数 3
和 5
。函数的返回值被存储在 result
变量中,并通过 println!
宏打印出来。
函数参数和返回值
Rust函数可以有多个参数,并且每个参数都需要指定类型。函数可以有一个返回值,其类型在函数定义中使用 ->
符号指定。如果函数没有返回值,可以使用 ()
表示空元组类型。
fn greet(name: &str) {println!("Hello, {}!", name);
}fn multiply(a: i32, b: i32) -> i32 {a * b
}// 通过元组,可以包含多个返回值
fn multi_result(a:i32, b:i32) -> (i32,i32){(a,b)
}
上述代码展示了两个函数的例子。 greet
函数接受一个名为 name
的字符串引用参数,并没有返回值。 multiply
函数接受两个 i32
类型的参数,并返回它们的乘积。
函数作为一等公民
在Rust中,函数是一等公民,这意味着函数可以像其他值一样被传递、赋值和返回。可以将函数作为参数传递给其他函数,也可以将函数作为返回值返回。
fn add(a: i32, b: i32) -> i32 {a + b
}fn subtract(a: i32, b: i32) -> i32 {a - b
}fn operation(op: fn(i32, i32) -> i32, a: i32, b: i32) -> i32 {op(a, b)
}let result = operation(add, 3, 5);
println!("Result: {}", result);
上述代码展示了如何将函数作为参数传递给 operation
函数,并在 operation
函数内部调用传递的函数。
println!(“Hello!”);
接下来我们再看下函数体的内容。 第一行就是println!("Hello!")
, 就很疑惑,要说是函数吧,为什么有个!
呢?要说不是函数吧,长得又太tm像了。 其实这是rust的另一个功能,宏。
宏
Rust 中的宏(Macro)是一种元编程工具,用于在编译时生成代码。宏允许你在编写 Rust 代码时创建自定义的代码片段,以简化重复的代码,增加代码的可读性和可维护性。宏可以接受不同数量和类型的参数,并根据这些参数生成代码。
下面是一个使用 Rust 自定义宏的例子:
macro_rules! greet {($name:expr) => {println!("Hello, {}!", $name);};
}fn main() {greet!("Alice");greet!("Bob");
}
在上面的例子中,我们定义了一个名为 greet
的宏。这个宏接受一个表达式参数 $name
,并生成一个打印欢迎消息的代码块。
在 main
函数中,我们使用 greet!
宏两次,分别传入不同的参数 "Alice"
和 "Bob"
。在编译时,宏会根据我们提供的参数展开,并生成相应的代码。最终的输出将是:
Hello, Alice!
Hello, Bob!
再看println!(“Hello!”);
我们看下println!
的定义
#[macro_export]
#[stable(feature = "rust1", since = "1.0.0")]
#[cfg_attr(not(test), rustc_diagnostic_item = "print_macro")]
#[allow_internal_unstable(print_internals)]
macro_rules! print {($($arg:tt)*) => {{$crate::io::_print($crate::format_args!($($arg)*));}};
}
上面的代码实际上等同于
println!("{}","Hello!");std::io::_print(std::format_args!("{}","Hello!"));
这样是不是就清楚多了
loop
Rust提供了几种不同的循环语句,用于重复执行代码块,loop是rust的循环实现的一种方式,
loop
循环
loop
循环是一个无限循环,它会无限次地执行一个代码块,直到遇到 break
关键字才会退出循环。
loop {// 无限循环的代码块// 可以使用 `break` 关键字来退出循环break;
}
在 loop
循环中,你可以使用 break
关键字来手动退出循环。这通常在满足某个条件时使用。
while
循环
while
循环会在满足给定条件的情况下重复执行一个代码块。
let mut i = 0;
while i < 5 {// 循环的代码块i += 1;
}
在 while
循环中,首先会判断条件是否为真,如果为真则执行循环体内的代码块,然后再次判断条件。如果条件为假,则退出循环。
for
循环
for
循环用于遍历一个集合或者一个范围内的元素,并执行相应的代码块。
let numbers = vec![1, 2, 3, 4, 5];
for number in numbers {// 循环的代码块println!("{}", number);
}
在 for
循环中,你需要提供一个可迭代的集合或者一个范围表达式。在每次循环迭代中,变量 number
会依次赋值为集合中的元素,并执行循环体内的代码块。
Rust还提供了其他一些循环相关的关键字和语法,如 continue
关键字用于跳过当前循环迭代, break
关键字用于退出循环,以及循环标签(loop label)用于在嵌套循环中指定退出的位置等。
let mut input = String::new();
这行Rust代码 let mut input = String::new();
的含义是创建一个可变的空字符串变量 input
。
具体解释如下:
let
:Rust中用于声明变量的关键字。mut
:表示变量是可变的(mutable),可以在后续的代码中修改其值。input
:变量名,可以根据需要进行命名。String::new()
:调用了String
类型的new()
函数,用于创建一个新的空字符串对象。
这行代码的作用是创建一个可变的字符串变量input
,并将其初始化为空字符串。这样,我们可以在后续的代码中使用input
变量来存储用户输入或其他字符串数据。
这里重点介绍一个点:mut
mut
mut 关键字用于声明可变变量(mutable variable)。使用 mut 关键字可以将一个变量标记为可变,允许在后续的代码中修改其值。 那么不适用mut会怎么样呢?
error[E0596]: cannot borrow `input` as mutable, as it is not declared as mutable--> src/main.rs:9:24|
9 | .read_line(&mut input)| ^^^^^^^^^^ cannot borrow as mutable|
help: consider changing this to be mutable|
7 | let mut input = String::new();| +++
给出了一个编译错误,并且给了修复方案,那就是在变量声明的时候加上mut
, 那么是为什么呢? 这里且卖一个关子,如果有等不及的可以看我另一篇博文(rust怎么搞的,这么简单的代码也报“borrow of moved value“?)。
变量类型
这里我们定义了String
类型的变量,那么rust中还有哪些常用类型呢?
- 整数类型(Integer Types):
整数类型用于表示整数值。在Rust中,整数类型有多种,包括有符号整数和无符号整数,分别用i
和u
前缀表示,后面跟上整数的位数。
let number: i32 = 42;
let unsigned_number: u64 = 100;
- 浮点数类型(Floating-Point Types):
浮点数类型用于表示带有小数部分的数值。在Rust中,浮点数类型有两种,分别是f32
和f64
,分别表示单精度浮点数和双精度浮点数。
let float_number: f32 = 3.14;
let double_number: f64 = 3.14159265359;
- 布尔类型(Boolean Type):
布尔类型用于表示真或假的值。在Rust中,布尔类型有两个可能的值,即true
和false
。
let is_true: bool = true;
let is_false: bool = false;
- 字符类型(Character Type):
字符类型用于表示单个Unicode字符。在Rust中,字符类型使用单引号'
表示。
let character: char = 'A';
- 数组类型(Array Type):
数组类型用于存储固定大小的元素序列。在Rust中,数组的大小是在编译时确定的,并且所有元素的类型必须相同。
let array: [i32; 3] = [1, 2, 3];
- 元组类型(Tuple Type):
元组类型用于存储多个不同类型的值。在Rust中,元组使用圆括号()
表示。
let tuple: (i32, f64, char) = (42, 3.14, 'A');
- 引用类型(Reference Type):
引用类型用于引用其他变量的值,而不是拥有自己的所有权。在Rust中,引用使用&
符号表示。
let value: i32 = 42;
let reference: &i32 = &value;
- 切片类型(Slice Type):
切片类型用于引用数组或向量的一部分数据。在Rust中,切片使用&[T]
表示。
let array: [i32; 5] = [1, 2, 3, 4, 5];
let slice: &[i32] = &array[..3];
- 字符串类型(String Type):
字符串类型用于存储文本数据。在Rust中,字符串类型由标准库提供,使用String
表示。
let string: String = String::from("Hello, Rust!");
- 向量类型(Vector Type):
向量类型用于存储可变大小的元素序列。在Rust中,向量由标准库提供,使用Vec<T>
表示。
let mut vector: Vec<i32> = Vec::new();
vector.push(1);
vector.push(2);
vector.push(3);
- 函数类型(Function Type):
函数类型用于定义函数。在Rust中,函数类型由函数的参数类型和返回类型组成。
fn add(a: i32, b: i32) -> i32 {a + b
}
- 结构体类型(Struct Type):
结构体类型用于自定义复杂的数据结构。在Rust中,结构体使用struct
关键字定义。
struct Person {name: String,age: u32,
}let person = Person {name: String::from("Alice"),age: 25,
};
- 枚举类型(Enum Type):
枚举类型用于定义具有不同变体的类型。在Rust中,枚举使用enum
关键字定义。
enum Color {Red,Green,Blue,
}let color: Color = Color::Red;
io::stdin()
io::stdin().read_line(&mut input).expect("Failed to read input!");
这段代码的作用是从标准输入读取一行输入,并将其存储到一个可变的字符串变量 input
中。下面是对代码的解释:
io::stdin()
:这是一个函数调用,返回一个标准输入的句柄(handle),用于从标准输入读取数据。.read_line(&mut input)
:这是对标准输入句柄调用的方法,用于读取一行输入。&mut input
表示将输入存储到一个可变的字符串变量input
中。&mut
表示传递一个可变引用,以便在方法内部修改变量的值。.expect("Failed to read input!")
:这是一个错误处理方法。如果读取输入时发生错误,会触发一个panic,并打印出错误信息"Failed to read input!"。
if input.contains(“quit”)
if input.contains("quit") {break;}
这段代码的作用是检查字符串变量 input
中是否包含子字符串"quit"。如果包含,则执行 break
语句,跳出当前循环。这里重点学习下if的语法
条件判断
Rust中的条件判断语法使用 if
和 else
关键字来实现。下面是条件判断的语法示例和实际例子:
if condition {// 当条件为真时执行的代码块
} else if condition2 {// 当条件2为真时执行的代码块
} else {// 当以上条件都不满足时执行的代码块
}
示例代码:
fn main() {let number = 10;if number > 0 {println!("The number is positive");} else if number < 0 {println!("The number is negative");} else {println!("The number is zero");}
}
最后一句i_say_what_u_say(input)
再前面函数位置已经介绍过了,就不做过多介绍。至此我们学习了rust项目的基本目录结构、函数的定义、分支语法(循环、条件)和宏定义。掌握了这些基础,就能写出简单的rust程序啦。
这里留一个课后作业:写一个斐波那契函数(Leetcode)。
关注我,学习rust不迷路
相关文章:

20天学会rust(二)rust的基础语法篇
在第一节(20天学rust(一)和rust say hi)我们配置好了rust的环境,并且运行了一个简单的demo——practice-01,接下来我们将从示例入手,学习rust的基础语法。 首先来看下项目结构: 项目…...

Stephen Wolfram:嵌入的概念
The Concept of Embeddings 嵌入的概念 Neural nets—at least as they’re currently set up—are fundamentally based on numbers. So if we’re going to to use them to work on something like text we’ll need a way to represent our text with numbers. And certain…...

springboot,swagger多个mapper包,多个controller加载问题
启动类添加MapperScan({"xxx.xxx.xxx.mapper","xxx.xxx.xxx.mapper"}) swagger配置类添加 Bean public Docket api01() {return new Docket(DocumentationType.SWAGGER_2)//.enable(swagger_is_enabl).apiInfo(new ApiInfoBuilder().title("你的title…...

湖大CG满分教程:作业训练四编程题20. 回文串(暴力×动态规划算法√)
问题描述 “回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。给你一个字符串,问最少在字符串尾添加多少字符,可以使得字符串变为回文串。 输入格式 有多组测试数据。 每组测试数据第一行是一个正整数N…...

使用toad库进行机器学习评分卡全流程
1 加载数据 导入模块 import pandas as pd from sklearn.metrics import roc_auc_score,roc_curve,auc from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression import numpy as np import math import xgboost as xgb …...

Python数据容器——列表(list)
数据容器入门 Python中的数据容器: 一种可以容纳多份数据的数据类型,容纳的每一份数据称之为1个元素 每一个元素,可以是任意类型的数据,如字符串、数字、布尔等。 数据容器根据特点的不同,如:是否支持重复元…...

Linux CEF(Chromium Embedded Framework)源码下载编译详细记录
Linux CEF(Chromium Embedded Framework)源码下载编译 背景 由于CEF默认的二进制分发包不支持音视频播放,需要自行编译源码,将ffmpeg开关打开才能支持。这里介绍的是Linux平台下的CEF源码下载编译过程。 前置条件 下载的过程非…...

Adaptive AUTOSAR—— Communication Management 3.1
9 Communication Management 9.1 What is Communication Management? 通信管理是自适应平台架构中的一个功能集群。 作为一个功能集群,通信管理向应用程序提供了一个C++ API,实现了面向服务的通信。服务是一个由应用程序提供的功能单元,可以在运行时被另一个应用程序动态…...

VMnet0 桥接设置
VMnet0 一定要设置为你的硬件物理网卡,不能设置自动,不然后,网线一断,就再也连不上了。必须重启电脑才能连上,这个问题找了很久才找到。 下面有个hyper-V虚拟网卡,如果选自动的话,物理网卡一掉…...

Sublime Text 4 Build 4151 4152 发布及注册方法
Sublime Text 是一个商业代码编辑器。它原生支持许多编程语言和标记语言,用户可以通过插件来扩展它的功能,这些插件通常是由社区建立的,并以自由软件许可证的形式维护。为了方便插件,Sublime Text 有一个 Python API。 Sublime T…...

第八篇: K8S Prometheus Operator实现Ceph集群企业微信机器人告警
Prometheus Operator实现Ceph集群企业微信告警 实现方案 我们的k8s集群与ceph集群是部署在不同的服务器上,因此实现方案如下: (1) ceph集群开启mgr内置的exporter服务,用于获取ceph集群的metrics (2) k8s集群通过 Service Endponit Ser…...

软件单元测试
单元测试目的和意义 对于非正式的软件(其特点是功能比较少,后续也不有新特性加入,不用负责维护),我们可以使用debug单步执行,内存修改,检查对应的观测点是否符合要求来进行单元测试,…...

Redis | 集群模式
Redis | 集群模式 随着互联网应用规模的不断扩大,单一节点的数据库性能已经无法满足大规模应用的需求。为了提高数据库的性能和可扩展性,分布式数据库成为了解决方案之一。Redis 作为一个高性能的内存数据库,自然也有了自己的分布式部署方式…...

8.3day04git+数据结构
文章目录 git版本控制学习高性能的单机管理主机的心跳服务算法题 git版本控制学习 一个免费开源,分布式的代码版本控制系统,帮助开发团队维护代码 作用:记录代码内容,切换代码版本,多人开发时高效合并代码内容 安装g…...

04-5_Qt 5.9 C++开发指南_QComboBox和QPlainTextEdit
文章目录 1. 实例功能概述2. 源码2.1 可视化UI设计2.2 widget.h2.3 widget.cpp 1. 实例功能概述 QComboBox 是下拉列表框组件类,它提供一个下拉列表供用户选择,也可以直接当作一个QLineEdit 用作输入。OComboBox 除了显示可见下拉列表外,每个…...

Sqlserver_Oracle_Mysql_Postgresql不同关系型数据库之主从延迟的理解和实验
关系型数据库主从节点的延迟是否和隔离级别有关联,个人认为两者没有直接关系,主从延迟在关系型数据库中一般和这两个时间有关:事务日志从主节点传输到从节点的时间事务日志在从节点的应用时间 事务日志从主节点传输到从节点的时间࿰…...

Clickhouse学习系列——一条SQL完成gourp by分组与不分组数值计算
笔者在近一两年接触了Clickhouse数据库,在项目中也进行了一些实践,但一直都没有一些技术文章的沉淀,近期打算做个系列,通过一些具体的场景将Clickhouse的用法进行沉淀和分享,供大家参考。 首先我们假设一个Clickhouse数…...

做好“关键基础设施提供商”角色,亚马逊云科技加快生成式AI落地
一场关于生产力的革命已在酝酿之中。全球管理咨询公司麦肯锡在最近的报告《生成式人工智能的经济潜力:下一波生产力浪潮》中指出,生成式AI每年可能为全球经济增加2.6万亿到4.4万亿美元的价值。在几天前的亚马逊云科技纽约峰会中,「生成式AI」…...

如何使用 ChatGPT 规划家居装修
你正在计划家庭装修项目,但不确定从哪里开始?ChatGPT 随时为你提供帮助。从集思广益的设计理念到估算成本,ChatGPT 可以简化你的家居装修规划流程。在本文中,我们将讨论如何使用 ChatGPT 有效地规划家居装修,以便你的项…...

题解 | #1002.Random Nim Game# 2023杭电暑期多校7
1002.Random Nim Game 诈骗博弈题 题目大意 Nim是一种双人数学策略游戏,玩家轮流从不同的堆中移除棋子。在每一轮游戏中,玩家必须至少取出一个棋子,并且可以取出任意数量的棋子,条件是这些棋子都来自同一个棋子堆。走最后一步棋…...

篇九:组合模式:树形结构的力量
篇九:“组合模式:树形结构的力量” 开始本篇文章之前先推荐一个好用的学习工具,AIRIght,借助于AI助手工具,学习事半功倍。欢迎访问:http://airight.fun/。 另外有2本不错的关于设计模式的资料,…...

【注册表】windows系统注册表常用修改方案
文章目录 ◆ 修改IE浏览器打印页面参数设置◆气泡屏幕保护◆彩带屏幕保护程序◆过滤IP(适用于WIN2000)◆禁止显示IE的地址栏◆禁止更改IE默认的检查(winnt适用)◆允许DHCP(winnt适用)◆局域网自动断开的时间(winnt适用)◆禁止使用“重置WEB设置”◆禁止更…...

ant-design-vue 4.x升级问题-样式丢失问题
[vue] ant-design-vue 4.x升级问题-样式丢失问题 项目环境问题场景解决方案 该文档是在升级ant-design-vue到4.x版本的时候遇到的问题 项目环境 "vue": "^3.3.4", "ant-design-vue": "^4.0.0", "vite": "^4.4.4&quo…...

【果树农药喷洒机器人】Part3:变量喷药系统工作原理介绍
本专栏介绍:免费专栏,持续更新机器人实战项目,欢迎各位订阅关注。 关注我,带你了解更多关于机器人、嵌入式、人工智能等方面的优质文章! 文章目录 一、变量喷药系统工作原理二、液压通路设计与控制系统封装2.1液压通路…...

GoogLeNet创新点总结
GoogLeNet是一种深度卷积神经网络架构,于2014年由Google团队提出,是ILSVRC(ImageNet Large Scale Visual Recognition Challenge)比赛的冠军模型,其创新点主要集中在以下几个方面: Inception模块&#…...

不同路径1、2、3合集(980. 不同路径 III)
不同路径一 矩形格,左上角 到 右下角。 class Solution {int [] directX new int[]{-1,1,0,0};int [] directY new int[]{0,0,-1,1};int rows;int cols;public int uniquePathsIII(int[][] grid) {if (grid null || grid.length 0 || grid[0].length 0) {ret…...

【云原生】Yaml文件详解
目录 一、YAML 语法格式1.1查看 api 资源版本标签1.2 写一个yaml文件demo1.3 详解k8s中的port 一、YAML 语法格式 Kubernetes 支持 YAML 和 JSON 格式管理资源对象JSON 格式:主要用于 api 接口之间消息的传递YAML格式:用于配置和管理,YAML 是…...

ffmpeg下载安装教程
ffmpeg官网下载地址https://ffmpeg.org/download.html 这里以windows为例,鼠标悬浮到windows图标上,再点击 Windows builds from gyan.dev 或者直接打开 https://www.gyan.dev/ffmpeg/builds/ 下载根据个人需要下载对应版本 解压下载的文件,并复制bin所在目录 新打开一个命令…...

uniapp之当你问起“tab方法触发时eventchange也跟着触发了咋办”时
我相信没有大佬会在这个问题上卡两个小时吧,记下来大家就当看个乐子了。 当时问题就是,点击tab头切换的时候,作为tab滑动事件的eventchange同时触发了,使得接口请求了两次 大概是没睡好,我当时脑子老想着怎么阻止它冒…...

TS 踩坑之路(四)之 Vue3
一、在使用定义默认值withDefaults和defineProps 组合时,默认值设置报错 代码案例 报错信息 不能将类型“{ isBackBtn: false; }”分配给类型“(props: PropsType) > RouteMsgType”。 对象字面量只能指定已知属性,并且“isBackBtn”不在类型“(pro…...