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

20天学会rust(三)没有object的rust怎么面向对象?

面向对象我们都很熟悉,可以说它是一种软件开发最重要的编程范式之一,它将程序中的数据和操作数据的方法组织成对象。面向对象有几个重要特性: 封装、继承和多态,基于这些特性带来了在可重用性、可维护性、扩展性、可靠性的优点。 Java提供了一套完整的实现,那么在Rust中如何面向对象编程呢?

别着急,在回答这个问题之前,我们先画个5分钟,学习几个基本概念,答案就呼之欲出了。

基本概念

结构体(struct)

结构体定义
在Rust中,通过使用 struct 关键字来定义结构体。结构体定义了一个包含多个字段的数据结构,并可以为结构体实现方法。每个字段都有自己的类型和名称。

// 定义一个Person结构体
struct Person {name: String,age: u32,
}

结构体创建
可以使用结构体的名称和字段的值来创建结构体。有两种常见的创建方式:

  1. 直接初始化:直接为每个字段指定值。
// 直接初始化结构体
let person = Person {name: String::from("Alice"),age: 30,
};
  1. 使用构造函数:通过实现一个返回结构体实例的函数来创建结构体。
impl Person {// 定义一个新的Person实例的构造函数fn new(name: String, age: u32) -> Person {Person { name, age }}
}// 使用构造函数创建结构体实例
let person = Person::new(String::from("Alice"), 30);

访问结构体字段:
可以使用点操作符( . )来访问结构体中的字段。通过结构体实例的名称后跟字段名称,即可访问该字段的值。

// 访问结构体字段
println!("Name: {}", person.name);
println!("Age: {}", person.age);

修改结构体字段:
在Rust中,结构体的字段默认是不可变的(immutable)。如果想要修改结构体的字段,可以使用 mut 关键字将结构体实例声明为可变的(mutable),然后通过点操作符来修改字段的值。
// 修改结构体字段

let mut mutable_person = Person::new(String::from("Bob"), 25);
mutable_person.age = 26;println!("Modified Age: {}", mutable_person.age);

在上述代码中,我们首先定义了一个名为Person的结构体,它有两个字段:name和age。然后,我们为Person结构体实现了一个构造函数 new ,用于创建新的Person实例。
main 函数中,我们通过直接初始化的方式实例化了一个Person结构体,将姓名设置为"Alice",年龄设置为30。然后,我们使用点操作符来访问结构体字段,并打印出姓名和年龄。
接下来,我们使用构造函数 Person::new 创建了一个可变的Person结构体实例 mutable_person ,将姓名设置为"Bob",年龄设置为25。然后,通过将实例声明为可变的,并使用点操作符来修改年龄字段的值为26,并打印出修改后的年龄。

ok,我们掌握了rust的对象定义方法,但是rust除了上述方式,还提供了一些struct的增强,学习了他们可以帮助更简洁的使用struct。

元组结构体

Rust中的元组结构体是一种特殊类型的结构体,它类似于元组,但具有命名的字段。元组结构体允许我们在结构体中组合不同类型的值,并为每个字段指定一个名称。直接看示例:

// 定义一个元组结构体
struct Person(String, u32);fn main() {// 创建一个Person实例let person = Person("Alice".to_string(), 25);// 访问元组结构体的字段let name = person.0;let age = person.1;println!("Name: {}", name);println!("Age: {}", age);
}

在上述代码中,我们定义了一个名为Person的元组结构体。它有两个字段:一个是String类型的name字段,另一个是u32类型的age字段。
main 函数中,我们创建了一个Person实例 person ,并为name字段赋值为"Alice",age字段赋值为25。
然后,我们通过使用索引来访问元组结构体的字段。元组结构体的字段可以使用 . 加上索引的方式进行访问,索引从0开始。在这个例子中,我们通过 person.0 访问了name字段,通过 person.1 访问了age字段。
最后,我们打印出name和age字段的值。
通过元组结构体,我们可以将不同类型的值组合在一起,并为每个字段指定一个名称,提高了代码的可读性和可维护性。

单元结构体

单元结构体是一种特殊类型的结构体,它不包含任何字段。它类似于C语言中的空结构体或者其他语言中的 unit 类型。单元结构体在Rust中常用于表示没有实际数据的情况,通常用作占位符或者标记类型。下面是一个示例代码来介绍单元结构体的使用:

// 定义一个单元结构体
struct EmptyStruct;fn main() {// 创建一个单元结构体实例let empty = EmptyStruct;// 访问单元结构体(无操作)// 打印单元结构体println!("{:?}", empty);
}

在上述代码中,我们定义了一个名为EmptyStruct的单元结构体。它没有任何字段。
main 函数中,我们创建了一个EmptyStruct实例 empty ,并没有对它进行任何操作。
最后,我们通过使用 println! 宏来打印出单元结构体 empty
单元结构体在Rust中用于表示没有实际数据的情况,通常用作占位符或者标记类型。例如,在某些情况下,我们可能只关心某个类型是否存在,而不关心它的具体值。这时,可以使用单元结构体来表示这种情况。

细心的朋友肯定注意到了,上面的例子里有一个新知识点:impl,这个是实现?我们下面就学习它

实现(impl)

impl 是Rust中的关键字,用于为类型实现方法。通过 impl 关键字,我们可以在特定类型上定义和实现方法。下面给出一个示例代码来介绍 impl 的使用:

// 定义一个名为Rectangle的结构体
struct Rectangle {width: u32,height: u32,
}// 为Rectangle结构体实现一个名为area的方法
impl Rectangle {// 定义area方法,用于计算矩形的面积fn area(&self) -> u32 {self.width * self.height}
}fn main() {// 创建一个Rectangle实例let rect = Rectangle {width: 10,height: 20,};// 调用Rectangle实例的area方法let area = rect.area();println!("Area: {}", area);
}

在上述代码中,我们首先定义了一个名为Rectangle的结构体,它有两个字段:width和height。然后,使用 impl 关键字为Rectangle结构体实现了一个名为area的方法。
impl Rectangle 块中,我们定义了一个area方法,用于计算矩形的面积。该方法接受一个 &self 参数,表示对Rectangle实例的借用。在方法体内,我们使用 self.widthself.height 来访问结构体的字段,并返回它们的乘积作为矩形的面积。
main 函数中,我们创建了一个Rectangle实例 rect ,并调用了它的area方法来计算矩形的面积。最后,我们打印出计算得到的面积。
通过 impl 关键字,我们可以在特定类型上定义和实现方法,使得代码更加模块化可读性更高

枚举

Rust中的枚举(Enum)是一种自定义数据类型,它允许我们将相关的值组合在一起,并为这些值定义一个公共的类型。枚举在Rust中非常常见,并且被广泛用于表示多个可能的取值。
下面使用颜色作为一个例子来说明枚举的使用。假设我们需要表示一组不同的颜色,可以使用枚举来定义这些颜色的类型。

enum Color {Red,Green,Blue,
}fn main() {let favorite_color = Color::Blue;match favorite_color {Color::Red => println!("I like red!"),Color::Green => println!("I like green!"),Color::Blue => println!("I like blue!"),}
}

在上述代码中,我们定义了一个名为Color的枚举类型,它有三个可能的取值:Red、Green和Blue。然后,在main函数中,我们创建了一个favorite_color变量,并将其设置为Color::Blue。接下来,我们使用match表达式来匹配favorite_color的取值,并根据不同的情况打印不同的消息。
通过枚举,我们可以将相关的值组合在一起,并为这些值定义一个公共的类型。这使得代码更加清晰和可读,同时也提供了更好的类型安全性。在实际开发中,枚举在表示状态、选项、错误类型等方面都非常有用。

接口(trait)

Rust中的trait可以类比java的implement,它是一种用于定义共享行为的机制。Trait可以看作是一组方法的抽象,它定义了一系列的方法签名,但没有提供默认的实现。通过实现trait,类型可以拥有这些方法,并共享相同的行为。
定义trait:
使用 trait 关键字可以定义一个trait,后面跟着trait的名称和方法签名。例如:

trait Printable {fn print(&self);
}

实现trait:
使用 impl 关键字可以为类型实现一个trait。在实现trait时,需要提供trait中定义的所有方法的具体实现。例如:

struct Person {name: String,
}
impl Printable for Person {fn print(&self) {println!("Name: {}", self.name);}
}

默认实现:

可以为trait中的方法提供默认的实现。这样,在实现trait时,如果不重写该方法,将会使用默认的实现。例如:

trait Printable {fn print(&self) {println!("Printing...");}
}

trait约束:
可以在函数或方法中使用trait约束,以指定参数必须实现某个trait。这样可以在函数内部使用trait中定义的方法。例如:

fn print_person<T: Printable>(person: T) {person.print();
}

多个trait约束:
可以使用 + 运算符将多个trait约束组合在一起。这样,参数必须同时实现这些trait。例如:

fn process<T: Printable + Clone>(data: T) {data.print();let cloned_data = data.clone();// ...
}

trait继承:
trait可以继承其他trait,从而扩展或组合行为。使用 : 符号可以指定一个trait继承另一个trait。例如:

trait Printable {fn print(&self);}trait Debuggable: Printable {fn debug(&self);}

Trait是Rust中非常强大的特性,它提供了一种灵活的方式来实现共享行为,并在编译时进行静态检查。通过trait,可以实现代码的重用性和可扩展性。

泛型

Rust是一种支持泛型编程的静态类型编程语言。泛型是一种编程技术,允许在编写代码时使用参数化类型,从而增加代码的灵活性和重用性。以下是Rust中泛型的一些特点和用法,并提供具体的例子:

  1. 定义泛型类型: 在Rust中,可以使用尖括号 <T> 来定义泛型类型。例如, Vec<T> 表示一个可以存储任意类型元素的动态数组。
let numbers: Vec<i32> = vec![1, 2, 3, 4, 5];
let names: Vec<String> = vec!["Alice".to_string(), "Bob".to_string()];
  1. 函数泛型: 在函数定义中,可以使用泛型类型参数来表示函数的参数和返回值的类型。例如, fn foo<T>(x: T) -> T 表示一个接受任意类型参数并返回相同类型的函数。
fn print_value<T>(value: T) {println!("Value: {}", value);
}print_value(42);
print_value("Hello");
  1. 结构体泛型: 在结构体定义中,可以使用泛型类型参数来表示结构体的字段类型。例如, struct Point<T> { x: T, y: T } 表示一个具有泛型字段的结构体。
struct Point<T> {x: T,y: T,
}let int_point: Point<i32> = Point { x: 10, y: 20 };
let float_point: Point<f64> = Point { x: 1.5, y: 2.5 };
  1. 方法泛型: 在结构体或枚举的方法定义中,可以使用泛型类型参数来表示方法的参数和返回值的类型。例如, impl<T> Point<T> { fn get_x(&self) -> &T } 表示一个具有泛型方法的结构体。
impl<T> Point<T> {fn get_x(&self) -> &T {&self.x}
}let int_point: Point<i32> = Point { x: 10, y: 20 };
println!("X coordinate: {}", int_point.get_x());
  1. trait泛型: 在trait定义中,可以使用泛型类型参数来表示关联类型或方法的参数和返回值的类型。例如, trait Iterator<Item = T> { fn next(&mut self) -> Option<T> } 表示一个具有泛型关联类型和方法的trait。
trait Iterator {type Item;fn next(&mut self) -> Option<Self::Item>;
}struct Counter {current: u32,max: u32,
}impl Iterator for Counter {type Item = u32;fn next(&mut self) -> Option<Self::Item> {if self.current < self.max {let value = self.current;self.current += 1;Some(value)} else {None}}
}let mut counter = Counter { current: 0, max: 5 };
while let Some(value) = counter.next() {println!("Counter: {}", value);
}
  1. 泛型约束: 可以使用泛型约束来限制泛型类型参数的行为。例如,fn foo<T: Display>(x: T) { println!("{}", x) } 表示一个接受实现了 Display trait的泛型参数的函数。
use std::fmt::Display;fn print_value<T: Display>(value: T) {println!("Value: {}", value);
}
print_value(42);
print_value("Hello");

通过泛型,Rust允许我们编写通用的代码,适用于多种类型,并在编译时进行静态检查,从而提高代码的灵活性和重用性。

OK,fine!到此我们学完了rust关于结构体的基础知识,那么怎么面向对象呢?

面向对象

Rust是一门多范式的编程语言,它支持面向对象编程(OOP)的概念,包括封装、继承和多态。下面我将用一个例子来说明如何在Rust中实现面向对象的代码。
假设我们要创建一个图形库,其中包含不同类型的图形对象,比如矩形(Rectangle)和圆形(Circle)。我们可以使用结构体(struct)和特征(trait)来实现封装、继承和多态。
首先,我们定义一个 Shape 特征,用于表示图形对象的共同行为:

trait Shape {fn area(&self) -> f64;fn display(&self);
}

在这个特征中,我们定义了两个方法: area 用于计算图形对象的面积, display 用于显示图形对象的信息。
接下来,我们实现 Rectangle 结构体,并为其实现 Shape 特征:

struct Rectangle {width: f64,height: f64,
}impl Shape for Rectangle {fn area(&self) -> f64 {self.width * self.height}fn display(&self) {println!("Rectangle: width={}, height={}", self.width, self.height);}
}

在这个实现中,我们为 Rectangle 结构体实现了 Shape 特征的方法。通过实现 area 方法,我们可以计算矩形的面积;通过实现 display 方法,我们可以打印矩形的信息。
类似地,我们可以实现 Circle 结构体,并为其实现 Shape 特征:

struct Circle {radius: f64,
}impl Shape for Circle {fn area(&self) -> f64 {std::f64::consts::PI * self.radius * self.radius}fn display(&self) {println!("Circle: radius={}", self.radius);}
}

在这个实现中,我们为 Circle 结构体实现了 Shape 特征的方法。通过实现 area 方法,我们可以计算圆形的面积;通过实现 display 方法,我们可以打印圆形的信息。
最后,我们可以在主函数中使用这些图形对象,并调用它们的方法:

fn main() {let rectangle = Rectangle { width: 5.0, height: 3.0 };let circle = Circle { radius: 2.0 };let shapes: Vec<Box<dyn Shape>> = vec![Box::new(rectangle),Box::new(circle),];for shape in shapes {shape.display();println!("Area: {}", shape.area());}
}

在这个例子中,我们创建了一个包含矩形和圆形对象的 shapes 向量,并使用 Box<dyn Shape> 来存储不同类型的图形对象。然后,我们遍历 shapes 向量,调用每个图形对象的 displayarea 方法。

通过这个例子,我们可以看到,在Rust中通过结构体和特征的组合,我们可以实现封装(将数据和行为封装在结构体中)、继承(通过实现特征来共享行为)和多态(通过使用 Box<dyn Shape> 来存储不同类型的对象)等面向对象的概念。是不是很简单,你学废了吗?

同样的留一个课后作业:用面向对象的方式完成题目:551. 学生出勤记录 I
,任何疑问评论区交流

相关文章:

20天学会rust(三)没有object的rust怎么面向对象?

面向对象我们都很熟悉&#xff0c;可以说它是一种软件开发最重要的编程范式之一&#xff0c;它将程序中的数据和操作数据的方法组织成对象。面向对象有几个重要特性&#xff1a; 封装、继承和多态&#xff0c;基于这些特性带来了在可重用性、可维护性、扩展性、可靠性的优点。 …...

整数规划——第三章 全单模矩阵

整数规划——第三章 全单模矩阵 若线性规划问题的约束矩阵为全单模矩阵&#xff0c;则该问题可行域的顶点都是整数点&#xff0c;从而线性规划与整数规划的最优解相同。 3.1 全单模性与最优性 考虑线性整数规划问题&#xff1a; (IP) min ⁡ c T x , s . t . A x ≤ b , x …...

数据结构和算法

数据结构和算法目录表 CCJava线性结构 1. 数组、单链表和双链表 2. Linux内核中双向链表的经典实现 数组、单链表和双链表 数组、单链表和双链表 栈 栈 栈 队列 队列 队列树形结构 二叉查找树 二叉查找树 二叉查找树 AVL树 AVL树 AVL树 伸展树 伸展树 伸展树 1. 红黑树(一)之…...

[Vulnhub] matrix-breakout-2-morpheus

目录 <1> 信息收集 <2> getshell <3> Privilege Escalation&#xff08;提权&#xff09; <1> 信息收集 nmap -sP 192.168.236.0/24 扫描一下靶机ip 靶机ip: 192.168.236.154 nmap -A -p 1-65535 192.168.236.154 扫描一下靶机开放哪些服务 开放…...

JDK, JRE和JVM之间的区别和联系

JDK, JRE和JVM是与Java编程语言相关的三个重要的概念&#xff0c;它们分别代表Java Development Kit&#xff08;Java开发工具包&#xff09;、Java Runtime Environment&#xff08;Java运行时环境&#xff09;和Java虚拟机&#xff08;Java Virtual Machine&#xff09;。它们…...

mac电脑访问windows共享文件夹连接不上(设置445端口)

前提&#xff1a;首先需要保证mac和windows都在同一局域网内&#xff0c;如果不在肯定是连不上的&#xff0c;就不用往下看了。 事情是这样的&#xff0c;公司入职发了mac电脑&#xff0c;但是我是window重度用户&#xff0c;在折腾mac的过程中&#xff0c;有许多文件需要从wi…...

metersphere性能压测执行过程

(1) 首先在controller层&#xff0c;通过RunTestPlanRequest接收请求参数 PostMapping("/run")public String run(RequestBody RunTestPlanRequest request) (2) 在PerformanceTestService中的run中进行具体的逻辑处理&#xff0c; 首先根据请求中ID来获取库中存储…...

揭秘Word高级技巧:事半功倍的文字处理策略

Microsoft Word是一款广泛使用的文字处理软件&#xff0c;几乎每个人都有使用过它的经历。但是&#xff0c;你是否知道Word中隐藏着许多高级技巧和功能&#xff0c;可以帮助你事半功倍地处理文字&#xff1f;在本文中&#xff0c;我们将揭秘一些Word的高级技巧&#xff0c;让你…...

06-1_Qt 5.9 C++开发指南_对话框与多窗体设计_标准对话框

在一个完整的应用程序设计中&#xff0c;不可避免地会涉及多个窗体、对话框的设计和调用&#xff0c;如何设计和调用这些对话框和窗体是搞清楚一个庞大的应用程序设计的基础。本章将介绍对话框和多窗体设计、调用方式、数据传递等问题&#xff0c;主要包括以下几点。 Qt 提供的…...

模拟实现消息队列项目(系列7) -- 实现BrokerServer

目录 前言 1. 创建BrokerServer类 1.1 启动服务器 1.2 停止服务器 1.3 处理一个客户端的连接 1.3.1 解析请求得到Request对象 1.3.2 根据请求计算响应 1.3.3 将响应写回给客户端 1.3.4 遍历Session的哈希表,把断开的Socket对象的键值对进行删除 2. 处理订阅消息请求详解(补充) …...

vscode插件不能搜索安装

1 现象 vscode搜索自己的插件&#xff0c;报错&#xff1a; Error while fetching extensions. HXR failed2 原因 之前用vscode开发golang语言&#xff0c;设置了proxy代理&#xff0c;所以导致错误&#xff0c;删除即可 重启vscode 3 结果...

路由器工作原理(第二十九课)

路由器工作原理(第二十九课) 一图胜过千言 1) 路由:数据从一个网络到另外一个网络之间转发数据包的过程称为路由 2) 路由器:连接不同网络,实现不同网段之间的通信 3)路由表:路由器选择数据的传输路径的依据 原始的路由表 Destination/Mask Proto Pre Cost …...

linux log 日志

/* author: hjjdebug * date: 2023年 08月 08日 星期二 13:18:08 CST * descriptor: linux log 日志 * destinator: 搞清linux 下log 日志 * 下面代码编译通过即可运行 */ #include <stdio.h> #include <syslog.h> int main(void) { // 打开系统日志, 可…...

uniapp获取当前页面高度

设置动态高度:style"{height: pageHeightpx}" <view class"uni-content" :style"{height: pageHeightpx}" >... </view>获取当前页面高度&#xff1a; onLoad() {// 获取当前窗口高度this.pageHeight uni.getSystemInfoSync().wi…...

Java课题笔记~ Spring 集成 MyBatis

Spring 集成 MyBatis 将 MyBatis 与 Spring 进行整合&#xff0c;主要解决的问题就是将 SqlSessionFactory 对象交由 Spring 来管理。所以该整合&#xff0c;只需要将 SqlSessionFactory 的对象生成器SqlSessionFactoryBean 注册在 Spring 容器中&#xff0c;再将其注入给 Dao…...

分布式系统理论基础

文章目录 介绍目标 正文CAPConsistencyAvailabilityPartition tolerance BASEBasically AvailableSoft StateEventually Consistent ACIDatomicityconsistencyisolationdurability 参考文档 介绍 分布式系统面临的场景往往是众口难调&#xff0c;“这也要&#xff0c;那也要”…...

mfc 编辑框限制

DoDataExchange由框架调用&#xff0c;作用是交互并且验证对话框数据&#xff0c;主要由(DDX) 和 (DDV)宏实现。 永远不要直接调用这个函数&#xff0c;而是通过UpdateData(TRUE/FALSE)实现控件与变量之间值的传递。 当然你也可以不使用DoDataExchange而完成控件与变量之间值…...

web基础与tomcat环境部署

一. 简述静态网页和动态网页的区别。 请求响应信息&#xff0c;发给客户端进行处理&#xff0c;由浏览器进行解析&#xff0c;显示的页面称为静态页面。处理文件类型如.html、jpg、.gif、.mp4、.swf、.avi、.wmv、.flv等 请求响应信息&#xff0c;发给事务端进行处理&#xff0…...

Go 变量

在Go中&#xff0c;有不同的变量类型&#xff0c;例如&#xff1a; int 存储整数&#xff08;整数&#xff09;&#xff0c;例如123或-123float32 存储浮点数字&#xff0c;带小数&#xff0c;例如19.99或-19.99string - 存储文本&#xff0c;例如“ Hello World”。字符串值用…...

【雷达通信】非相干多视处理(CSA)(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

73. 矩阵置零

题目链接&#xff1a;力扣 解题思路&#xff1a; 方法一&#xff1a;比较容易想到的方向&#xff0c;使用两个数组row和col保存有0的行或者列&#xff0c;然后将有0的那一行或那一列的所有元素都设置为0 AC代码 class Solution {public void setZeroes(int[][] matrix) {in…...

‘大数据技术与应用’和‘数据科学与大数据技术’有什么区别

一、侧重点不同 ‘大数据技术与应用’主要侧重于大数据的存储、处理和分析技术、包括数据挖掘、机器学习、数据仓库、分布式计算等方面的研究&#xff0c;旨在开发大数据相关的应用程序和系统&#xff0c;以满足商业和企业的需求。 ‘数据科学与大数据技术’则更加注重数据本…...

没有jsoup,rust怎么解析html呢?

在 Rust 中&#xff0c;你可以使用各种库来解析网页内容。一个常用的库是 reqwest &#xff0c;它提供了一个简单的方式来发送 HTTP 请求并获取网页内容。另外&#xff0c;你可以使用 scraper 或 select 等库来解析 HTML 或 XML 格式的网页内容。 下面是一个使用 reqwest 和 sc…...

【C高级】Day4 shell脚本 排序

1. 整理思维导图 2. 写一个函数&#xff0c;获取用户的uid和gid并使用变量接收 #!/bin/bash function getid() {uidid -ugidid -g }getid echo "uid$uid" echo "gid$gid"3. 整理冒泡排序、选择排序和快速排序的代码 #include <myhead.h>void Inp…...

大模型开发(十六):从0到1构建一个高度自动化的AI项目开发流程(中)

全文共1w余字&#xff0c;预计阅读时间约40~60分钟 | 满满干货(附代码)&#xff0c;建议收藏&#xff01; 本文目标&#xff1a;通过LtM提示流程实现自动构建符合要求的函数&#xff0c;并通过实验逐步完整测试code_generate函数功能。 代码下载点这里 一、介绍 此篇文章为…...

【深入了解pytorch】PyTorch强化学习:强化学习的基本概念、马尔可夫决策过程(MDP)和常见的强化学习算法

【深入了解pytorch】PyTorch强化学习:强化学习的基本概念、马尔可夫决策过程(MDP)和常见的强化学习算法 PyTorch强化学习:介绍强化学习的基本概念、马尔可夫决策过程(MDP)和常见的强化学习算法引言强化学习的基本概念状态(State)动作(Action)奖励(Reward)策略(Pol…...

尚硅谷张天禹Vue2+Vue3笔记(待续)

简介 什么是Vue&#xff1f; 一套用于构建用户界面的渐进式JavaScript框架。将数据转变成用户可看到的界面。 什么是渐进式&#xff1f; Vue可以自底向上逐层的应用 简单应用:只需一个轻量小巧的核心库 复杂应用:可以引入各式各样的Vue插件 Vue的特点是什么&#xff1f; 1.采…...

深度学习(35)—— StarGAN(2)

深度学习&#xff08;34&#xff09;—— StarGAN&#xff08;2&#xff09; 完整项目在这里&#xff1a;欢迎造访 文章目录 深度学习&#xff08;34&#xff09;—— StarGAN&#xff08;2&#xff09;1. build model&#xff08;1&#xff09;generator&#xff08;2&#…...

连续四年入选!三项荣耀!博云科技强势上榜Gartner ICT技术成熟度曲线

日&#xff0c;全球知名咨询公司Gartner发布了2023年度的《中国ICT技术成熟度曲线》&#xff08;《Hype Cycle for ICT in China, 2023》&#xff0c;以下简称“报告”&#xff09;。令人瞩目的是&#xff0c;博云科技在报告中荣获三项殊荣&#xff0c;入选云原生计算&#xff…...

Docker实战-操作Docker容器实战(一)

导语   在之前的分享中&#xff0c;我们介绍了关于如何去操作Docker镜像&#xff0c;下面我们来看看如何去操作容器。 简单来讲&#xff0c;容器是镜像运行的一个实例&#xff0c;与镜像不同的是镜像只能作为一个静态文件进行读取&#xff0c;而容器是可以在运行时进行写入操…...

东莞清洁服务网站建设/关键词优化的作用

首先&#xff0c;关注破千了&#xff0c;感谢大家的支持。D2-Net A Trainable CNN for Joint Description and Detection of Local Featureshttps://arxiv.org/pdf/1905.03561.pdf​arxiv.org一、论文出发点传统的关键点检测&#xff0c;例如&#xff33;&#xff29;&#xf…...

东莞网站建设lhznkj/seo外包网站

Linux中使用curl命令出现403错误的解决办法 403错误&#xff0c;是网站访问过程中&#xff0c;常见的错误提示&#xff0c;资源不可用&#xff0c; 服务器理解客户请求&#xff0c;但拒绝处理它&#xff0c;通常由于服务器上文件或目录的权限设置导致&#xff0c; 比如IIS或者a…...

企业名录搜索软件排行榜/如何seo搜索引擎优化

css3动画&#xff1a;弹出式菜单 今天主要来讲讲transition和transform结合做的动画&#xff0c;会举一些现在&#xff08;2017年&#xff09;常见的动画例子。 注&#xff1a;本人也接触css3不久&#xff0c;如果写的有纰漏请指出&#xff0c;不喜勿喷。 弹出式菜单 效果&…...

设计网站网站名称/企业网站营销实现方式解读

继上一篇http://www.cnblogs.com/EasonJim/p/7613595.html介绍了断路器之后&#xff0c;其实它还提供了一个管理页面来监控这些应用的调用数据。 首先&#xff0c;我是基于上一个例子ZooKeeper实现的服务注册与发现&#xff1a;http://www.cnblogs.com/EasonJim/p/7613734.html…...

时代网站管理系统怎么做网站/今天重大新闻头条新闻

var time1; var srcollOld 0,srcollNow 0,scrollFun false; $(window).scroll(function () {//$(window).scrollTop()这个方法是当前滚动条滚动的距离//$(window).height()获取当前窗体的高度//$(document).height()获取当前文档的高度var bot 50; //bot是底部距离的高度i…...

重庆市网站建设/搜索引擎营销案例分析

作为普通的网民来说&#xff0c;一般不需要知道也不用关心什么是盗链&#xff0c;不过如果你是网站的开发者或维护者&#xff0c;就不得不重视盗链的问题了。如果你刚刚开发完一个没有防盗链的带有文件下载功能的网站&#xff0c;挂上internet&#xff0c;然后上传几个时下非常…...