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

ArkTS语言入门之接口、泛型、空安全、特殊运算符等

前言

臭宝们,今天我们来学习ArkTS中最后的一些内容。

实现接口

包含implements子句的类必须实现列出的接口中定义的所有方法,但使用默认实现定义的方法除外。

interface DateInterface {now(): string;
}
class MyDate implements DateInterface {now(): string {// 在此实现return 'now';}
}

接口属性

接口属性可以是字段、getter、setter或getter和setter组合的形式。

interface Style {color: string;
}

接口继承

接口可以继承其他接口,如下面的示例所示:

interface Style {color: string;
}interface ExtendedStyle extends Style {width: number;
}

注意:继承接口包含被继承接口的所有属性和方法,还可以添加自己的属性和方法。

抽象类和接口

在上一节中,我们介绍了如何在ArkTS中使用抽象类。抽象类与接口都无法实例化。抽象类是类的抽象,抽象类用来捕捉子类的通用特性,接口是行为的抽象。在ArkTS中抽象类与接口的区别如下:

  • 一个类只能继承一个抽象类,而一个类可以实现一个或多个接口;
  • 接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
  • 抽象类里面可以有方法的实现,但是接口完全都是抽象的,不存在方法的实现;
  • 抽象类可以有构造函数,而接口不能有构造函数。

泛型在接口和类中的应用

class CustomStack<Element> {public push(e: Element):void {// ...}
}

要使用类型CustomStack,必须为每个类型参数指定类型实参:

let s = new CustomStack<string>();
s.push('hello');

编译器在使用泛型类型和函数时会确保类型安全。参见以下示例:

let s = new CustomStack<string>();
s.push(55); // 将会产生编译时错误

泛型约束

泛型类型的类型参数可以被限制只能取某些特定的值。例如,MyHashMap<Key, Value>这个类中的Key类型参数必须具有hash方法。

interface Hashable {hash(): number;
}
class MyHashMap<Key extends Hashable, Value> {public set(k: Key, v: Value) {let h = k.hash();// ...其他代码...}
}

在上面的例子中,Key类型扩展了Hashable,Hashable接口的所有方法都可以为key调用。

泛型函数

function last(x: number[]): number {return x[x.length - 1];
}
last([1, 2, 3]); // 3

如果需要为任何数组定义相同的函数,使用类型参数将该函数定义为泛型:

function last<T>(x: T[]): T {return x[x.length - 1];
}

现在,该函数可以与任何数组一起使用。

在函数调用中,类型实参可以显式或隐式设置:

// 显式设置的类型实参
last<string>(['aa', 'bb']);
last<number>([1, 2, 3]);// 隐式设置的类型实参
// 编译器根据调用参数的类型来确定类型实参
last([1, 2, 3]);
last(['aa', 'bb']);

泛型默认值

泛型类型的类型参数可以设置默认值。这样可以不指定实际的类型实参,而只使用泛型类型名称。下面的示例展示了类和函数的这一点。

class SomeType {}
interface Interface <T1 = SomeType> { }
class Base <T2 = SomeType> { }
class Derived1 extends Base implements Interface { }
// Derived1在语义上等价于Derived2
class Derived2 extends Base<SomeType> implements Interface<SomeType> { }function foo<T = number>(): T {// ...
}
foo();
// 此函数在语义上等价于下面的调用
foo<number>();

空安全

在ArkTS中,ArkTS中的所有类型都是不可为空的,在下面的示例中,所有行都会导致编译时错误:

let x: number = null;    // 编译时错误
let y: string = null;    // 编译时错误
let z: number[] = null;  // 编译时错误

可以为空值的变量定义为联合类型T | null。

let x: number | null = null;
x = 1;    // ok
x = null; // ok
if (x != null) { /* do something */ }

非空断言运算符(!)

后缀运算符!可用于断言其操作数为非空。

应用于可空类型的值时,它的编译时类型变为非空类型。例如,类型将从T | null更改为T:

class A {value: number = 0;
}function foo(a: A | null) {a.value;   // 编译时错误:无法访问可空值的属性a!.value;  // 编译通过,如果运行时a的值非空,可以访问到a的属性;如果运行时a的值为空,则发生运行时异常
}

空值合并运算符(??)

空值合并二元运算符??用于检查左侧表达式的求值是否等于null或者undefined。如果是,则表达式的结果为右侧表达式;否则,结果为左侧表达式。

换句话说,a ?? b等价于三元运算符(a != null && a != undefined) ? a : b。

在以下示例中,getNick方法如果设置了昵称,则返回昵称;否则,返回空字符串:

class Person {// ...nick: string | null = null;getNick(): string {return this.nick ?? '';}
}

可选链

在访问对象属性时,如果该属性是undefined或者null,可选链运算符会返回undefined。

class Person {nick: string | null = null;spouse?: PersonsetSpouse(spouse: Person): void {this.spouse = spouse;}getSpouseNick(): string | null | undefined {return this.spouse?.nick;}constructor(nick: string) {this.nick = nick;this.spouse = undefined;}
}

模块

程序可划分为多组编译单元或模块。

每个模块都有其自己的作用域,即,在模块中创建的任何声明(变量、函数、类等)在该模块之外都不可见,除非它们被显式导出。

与此相对,从另一个模块导出的变量、函数、类、接口等必须首先导入到模块中。

导出

可以使用关键字export导出顶层的声明。

未导出的声明名称被视为私有名称,只能在声明该名称的模块中使用。

export class Point {x: number = 0;y: number = 0;constructor(x: number, y: number) {this.x = x;this.y = y;}
}
export let Origin = new Point(0, 0);
export function Distance(p1: Point, p2: Point): number {return Math.sqrt((p2.x - p1.x) * (p2.x - p1.x) + (p2.y - p1.y) * (p2.y - p1.y));
}

导入

导入声明用于导入从其他模块导出的实体,并在当前模块中提供其绑定。导入声明由两部分组成:

  • 导入路径,用于指定导入的模块;
  • 导入绑定,用于定义导入的模块中的可用实体集和使用形式(限定或不限定使用)。

假设模块具有路径“./utils”和导出实体“X”和“Y”。

导入绑定* as A表示绑定名称“A”,通过A.name可访问从导入路径指定的模块导出的所有实体:导入绑定可以有几种形式。

import * as Utils from './utils';
Utils.X // 表示来自Utils的X
Utils.Y // 表示来自Utils的Y

导入绑定{ ident1, …, identN }表示将导出的实体与指定名称绑定,该名称可以用作简单名称:

import { X, Y } from './utils';
X // 表示来自utils的X
Y // 表示来自utils的Y

如果标识符列表定义了ident as alias,则实体ident将绑定在名称alias下:

import { X as Z, Y } from './utils';
Z // 表示来自Utils的X
Y // 表示来自Utils的Y
X // 编译时错误:'X'不可见

动态导入

应用开发的有些场景中,如果希望根据条件导入模块或者按需导入模块,可以使用动态导入代替静态导入。

import()语法通常称为动态导入(dynamic import),是一种类似函数的表达式,用来动态导入模块。以这种方式调用,将返回一个promise。

如下例所示,import(modulePath)可以加载模块并返回一个promise,该promise resolve为一个包含其所有导出的模块对象。该表达式可以在代码中的任意位置调用。

// Calc.ts
export function add(a:number, b:number):number {let c = a + b;console.info('Dynamic import, %d + %d = %d', a, b, c);return c;
}// Index.ts
import("./Calc").then((obj: ESObject) => {console.info(obj.add(3, 5));  
}).catch((err: Error) => {console.error("Module dynamic import error: ", err);
});

如果在异步函数中,可以使用let module = await import(modulePath)。

// say.ts
export function hi() {console.log('Hello');
}
export function bye() {console.log('Bye');
}
async function test() {let ns = await import('./say');let hi = ns.hi;let bye = ns.bye;hi();bye();
}

this 关键字

关键字this只能在类的实例方法中使用。

class A {count: string = 'a';m(i: string): void {this.count = i;}
}

使用限制:

  • 不支持this类型
  • 不支持在函数和类的静态方法中使用this
class A {n: number = 0;f1(arg1: this) {} // 编译时错误,不支持this类型static f2(arg1: number) {this.n = arg1;  // 编译时错误,不支持在类的静态方法中使用this}
}function foo(arg1: number) {this.n = i;       // 编译时错误,不支持在函数中使用this
}

关键字this的指向:

  • 调用实例方法的对象
  • 正在构造的对象

结尾

至此,我们已经学习了ArkTS的基础语法。下一步,我们将学习ArkUI框架。臭宝们,冲鸭!

相关文章:

ArkTS语言入门之接口、泛型、空安全、特殊运算符等

前言 臭宝们&#xff0c;今天我们来学习ArkTS中最后的一些内容。 实现接口 包含implements子句的类必须实现列出的接口中定义的所有方法&#xff0c;但使用默认实现定义的方法除外。 interface DateInterface {now(): string; } class MyDate implements DateInterface {no…...

蓝桥杯c++每日刷题(洛谷)

目录 P10385 [蓝桥杯 2024 省 A] 艺术与篮球 - 洛谷 (luogu.com.cn) P8706 [蓝桥杯 2020 省 AB1] 解码 - 洛谷 (luogu.com.cn) P8711 [蓝桥杯 2020 省 B1] 整除序列 - 洛谷 (luogu.com.cn) P8722 [蓝桥杯 2020 省 AB3] 日期识别 - 洛谷 (luogu.com.cn) P10385 [蓝桥杯 2024…...

Python+Requests 企业级接口测试入门(1~3天)

PythonRequests 企业级接口测试入门 1、GET接口简单案例 我的答案&#xff1a; import time import requestsdef get_all_users():try:response requests.get(urlhttps://reqres.in/api/users, #接口地址timeout10 #超时时间)respons…...

【android bluetooth 框架分析 01】【关键线程 3】【bt_jni_thread 线程介绍】

1. bt_jni_thread 职责介绍 bt_jni_thread 这个线程的作用是专门负责处理蓝牙 JNI 层的消息循环&#xff0c;也可以说是 C 层和 Java 层交互的桥梁线程。 1.1 什么是 JNI 层&#xff1f;为什么需要这个线程&#xff1f; JNI&#xff08;Java Native Interface&#xff09;是 …...

CCF - GESP Python三级考试题目示例

CCF - GESP Python三级考试题目示例&#xff0c;你可以根据实际需求进行调整。 一、单选题&#xff08;每题2分&#xff0c;共30分&#xff09; 以下关于Python中函数的说法&#xff0c;错误的是&#xff08; &#xff09; A. 函数定义使用def关键字 B. 函数必须有返回值 C.…...

Windows10系统更改盘符

Windows10系统更改盘符 导航 文章目录 Windows10系统更改盘符导航更改盘符 更改盘符 按下wini,再按k进入磁盘管理器 右击你想更改的磁盘&#xff0c;选择“更改驱动器号”和路径&#xff0c;选择好驱动器号后确定即可...

软件功能性测试有多重要?功能性测试工具有哪些?

软件功能性测试是指对软件应用程序进行的测试&#xff0c;旨在验证软件的每一个功能是否按预定要求正常运作。功能性测试通常基于软件的需求文档&#xff0c;从用户的角度出发&#xff0c;确保所有功能都能够满足用户的需求。 软件功能性测试在软件开发生命周期中扮演着至关重…...

未来生态映像:杭州的科技自然协奏曲

故事背景 故事发生在2050年的中国杭州&#xff0c;这座千年古城已蜕变为科技与自然完美交融的未来生态之城。从晨曦微露的西湖到暮色中的良渚文化村&#xff0c;每个角落都上演着人类智慧与自然韵律的动人对话。 故事摘要 当第一缕阳光亲吻西湖的生态浮岛&#xff0c;无人机携带…...

电商核心指标解析与行业趋势:数据驱动的增长策略【大模型总结】

电商核心指标解析与行业趋势&#xff1a;数据驱动的增长策略 在电商领域&#xff0c;数据是决策的核心。从流量监测到用户行为分析&#xff0c;从价格策略到技术赋能&#xff0c;每一个环节的优化都离不开对核心指标的深度理解。本文结合行业最新趋势与头部平台实践&#xff0…...

ubuntu自动更新--unattended-upgrades

ubuntu自动更新--unattended-upgrades 1 介绍2 发展历程3 配置与使用4 disable Auto update服务命令 参考 1 介绍 Unattended-Upgrades 是一个用于自动更新 Debian 及其衍生系统&#xff08;如 Ubuntu&#xff09;的工具。它的主要功能是自动检查、下载并安装系统更新&#xf…...

在Ubuntu 22.04上配置【C/C++编译环境】

在Ubuntu 22.04上配置C/C编译环境 如果你想在Ubuntu 22.04上编译和运行C或C程序&#xff0c;首先需要安装一个合适的编译器和相关工具。本文将为你提供详细的安装建议和操作步骤&#xff0c;帮助你快速搭建开发环境。 准备工作 在开始之前&#xff0c;确保你的系统可以通过终…...

费马小定理

快速幂 理论 a n a a ⋯ a a^n a a \cdots a anaa⋯a&#xff0c;暴力的计算需要 O(n) 的时间。 快速幂使用二进制拆分和倍增思想&#xff0c;仅需要 O(logn) 的时间。 对 n 做二进制拆分&#xff0c;例如&#xff0c; 3 13 3 ( 1101 ) 2 3 8 ⋅ 3 4 ⋅ 3 1 3^{13}…...

什么是音频预加重与去加重,预加重与去加重的原理是什么,在什么条件下会使用预加重与去加重?

音频预加重与去加重是音频处理中的两个重要概念&#xff0c;以下是对其原理及应用条件的详细介绍&#xff1a; 1、音频预加重与去加重的定义 预加重&#xff1a;在音频信号的发送端&#xff0c;对音频信号的高频部分进行提升&#xff0c;增加高频信号的幅度&#xff0c;使其在…...

程序代码篇---时间复杂度空间复杂度

文章目录 前言一、时间复杂度&#xff08;Time Complexity&#xff09;定义1. 常见时间复杂度类型2. 计算规则忽略常数项保留最高阶项循环嵌套递归算法 3. 代码示例&#xff08;1&#xff09;&#x1d442;(1)&#xff1a;常数时间&#xff08;2&#xff09;&#x1d442;(&…...

化工企业数字化转型:从数据贯通到生态重构的实践路径

一、战略定位&#xff1a;破解行业核心痛点 化工行业面临生产安全风险高&#xff08;全国危化品企业事故率年增5%&#xff09;、能耗与排放压力大&#xff08;占工业总能耗12%&#xff09;、供应链协同低效&#xff08;库存周转率低于制造业均值30%&#xff09;三大挑战。《石…...

Mysql备忘记录

1、简介 Mysql操作经常忘记命令&#xff0c;本文将持续记录Mysql一些常用操作。 2、常见问题 2.1、忘记密码 # 1、首先停止Mysql服务 systemctl stop mysqld # windows 从任务管理器里面停 # 2、更改配置文件 my.cnf (windows是 ini文件) vim /etc/my.cnf 在[mysqld]下面添…...

Python 爬取 1688.item_get_factory 接口:获取工厂档案信息实战指南

在电商采购和供应链管理中&#xff0c;了解供应商的工厂信息是至关重要的一步。1688 作为国内领先的 B2B 平台&#xff0c;提供了丰富的供应商和工厂档案信息。通过 item_get_factory API 接口&#xff0c;开发者可以获取工厂的详细信息&#xff0c;包括工厂名称、地址、联系方…...

【Proteus仿真】【32单片机-A009】矩阵按键系统设计

目录 一、主要功能 二、使用步骤 三、硬件资源 四、软件设计 五、实验现象 联系作者 一、主要功能 1、按键值与LCD显示 2、矩阵按键 二、使用步骤 系统运行后&#xff0c;LCD1602显示当前的按键值&#xff1b; 当按下不同按键后显示屏更新对应的按键值。 三、硬件资…...

【11408学习记录】英语语法精析:主从复合句之定语从句完全指南——从规则到实战例句一网打尽

定语从句 英语语法总结——主从复合句定语从句定语从句的写法先行词的作用分类定语从句的使用补充 每日一句词汇第一步&#xff1a;找谓语第二步&#xff1a;断开第三步&#xff1a;简化第一句第二句第三句第四句 英语 语法总结——主从复合句 定语从句 定语从句就是一个句子…...

go游戏后端开发31:麻将游戏的碰牌与胡牌逻辑

以下是润色后的版本&#xff1a; 1. 碰牌逻辑 1.1 触发碰牌 当一个玩家弃牌后&#xff0c;其他玩家可以选择碰牌。如果当前玩家决定碰牌&#xff0c;系统需要通知所有玩家这一操作。碰牌操作完成后&#xff0c;当前玩家需要出一张牌&#xff0c;系统同样需要通知所有玩家。 …...

vLLM实战:多机多卡大模型分布式推理部署全流程指南

1. 环境准备与基础配置 1.1 系统要求 依赖组件&#xff1a; # 基础工具安装 sudo apt-get install -y lsof git-lfs nvidia-cuda-toolkit1.2 虚拟环境配置 使用conda创建隔离环境&#xff0c;避免依赖冲突&#xff1a; conda create -n vllm python3.10 -y conda activate…...

RAI Toolbox详解

RAI Toolbox详解 摘要 RAI Toolbox是一个综合性的工具集&#xff0c;旨在帮助开发者和AI系统利益相关者更负责任地开发和监控AI系统&#xff0c;并做出更好的数据驱动决策。本文将详细介绍RAI Toolbox的功能、使用场景以及与类似AI项目的对比&#xff0c;帮助读者全面了解RAI…...

Python高级爬虫之js逆向+安卓逆向1.3节:Python数据类型

目录 引言&#xff1a; 1.3.1 两大数据类型 1.3.2 不可变数据类型 1.3.3 可变数据类型 1.3.4 再不跳槽就老了 引言&#xff1a; 大神薯条老师的高级爬虫安卓逆向教程&#xff1a; 这套爬虫教程会系统讲解爬虫的初级&#xff0c;中级&#xff0c;高级知识&#xff0c;涵盖…...

The 2024 CCPC National Invitational Contest (Changchun),第17届吉林省赛 C

补题链接 题解是什么意思呢&#xff0c;首先我们需要知道的是&#xff0c;斐波那契数列可以用矩阵快速幂和矩阵乘法求解 ( F ( n 1 ) F ( n ) ) ( 1 1 1 0 ) ( F ( n ) F ( n − 1 ) ) M ( F ( n ) F ( n − 1 ) ) \begin{pmatrix}F(n1) \\ F(n)\end{pmatrix} \begin{pma…...

GPT-4o-image模型:开启AI图片编辑新时代

在生成式AI技术爆发式迭代的今天&#xff0c;智创聚合API率先突破多模态创作边界&#xff0c;正式发布集成GPT-4o-image模型的创作平台&#xff0c;以“文生图-图生图-循环编辑”三位一体的技术矩阵&#xff0c;重新定义数字内容生产流程。生成图像效率较传统工具提升300%&…...

Java流程控制【if分支三种形式】

if分支三种形式 ①if(条件表达式) 代码&#xff1b; }②if(条件表达式){ 代码1&#xff1b; }else{ 代码2&#xff1b; }③if(条件表达式1){ 代码1&#xff1b; }else if(条件表达式2){ 代码2&#xff1b; }else if(条件表达式3){ 代码3&#xff1b;...... }else{ 代码n&#…...

2025 年陕西消防设施操作员考试攻略:历史文化名城的消防传承与创新​

陕西拥有丰富的历史文化遗产&#xff0c;众多古建筑分布其中&#xff0c;同时也在不断推进现代化建设&#xff0c;消防工作面临传承与创新的双重任务&#xff0c;这在考试中也有所体现。​ 考点融合与特色&#xff1a;一方面&#xff0c;古建筑的消防保护是重点&#xff0c;包…...

关于node.js 隐式修改数组长度的问题

// 删除手牌 proto.remove function (handCards, _cards) { let saveHandCards this.deepCloneTL(handCards);//保存原先的牌 console.warn("删除手牌000:",JSON.stringify(handCards)); console.warn("删除手牌111:",JSON.stringify(_card…...

探索文件与流的世界:File、InputStream 和 OutputStream 的奇妙之旅

目录 一、File 类——文件管理的小能手 1. 创建和删除文件 2. 检查文件属性 3. 路径操作 二、InputStream——读取数据的管道 1. 读取单个字节 2. 批量读取字节 3. 关闭流 三、OutputStream——写入数据的通道 1. 写入单个字节 2. 批量写入字节 3. 刷新和…...

nginx镜像创建docker容器,及其可能遇到的问题

一、基本流程 1、目录准备 我喜欢把文件放在/data下。 # 进入根目录的data目录 cd /data# 创建nginx目录 mkdir nginx# 进入nginx目录 cd nginx# 创建conf目录 mkdir conf# 进入conf目录 cd conf# 创建conf.d目录 mkdir conf.d 2、文件准备 &#xff08;1&#xff09;nginx…...

测试用例 [软件测试 基础]

目录 测试用例 1. 概念 1.1 什么是测试用例 1.2 什么是要素 1.3 为什么需要测试用例 2. 设计测试用例的万能公式 2.1 常规思维 逆向思维 发散性思维 2.2 万能公式 3. 设计测试用例的方法 3.1 基于需求的设计方法 3.2 具体的设计方法 3.3 更多用例练习 测试用例 …...

树的直径 (dp或贪心)

B4016 树的直径 - 洛谷 题目大意&#xff1a; 给定一棵 n 个结点的树&#xff0c;树没有边权。请求出树的直径是多少&#xff0c;即树上的最长路径长度是多少。 思路&#xff1a; 树形 d p dp dp 求树的直径 定义 d [ x ] d[x] d[x] 表示以 x x x 节点出发走向 x x x 的…...

C++ 入门二:C++ 编程预备知识

一、使用 Qt Creator 创建 C 工程 1.1 打开软件 在计算机中找到 Qt Creator 的应用程序图标并双击打开它。如果是首次打开&#xff0c;可能需要进行一些初始化设置&#xff0c;如选择默认的开发环境等。 1.2 选择 C 工程 打开 Qt Creator 后&#xff0c;在欢迎界面中点击 “…...

IT管理思路

甲方CIO和IT管理者-如何做好组织级IT能力提升_哔哩哔哩_bilibili...

C++17模板编程与if constexpr深度解析

一、原理深化 1.1 模板编程 1.1.1 编译器如何处理模板&#xff08;补充&#xff09; 模板的实例化机制存在两种模式&#xff1a; 隐式实例化&#xff1a;编译器在遇到模板具体使用时自动生成代码&#xff0c;可能导致多翻译单元重复实例化&#xff0c;增加编译时间。显式实…...

指令层级:训练大型语言模型优先处理特权指令

指令层级&#xff1a;训练大型语言模型优先处理特权指令 The Instruction Hierarchy: Training LLMs to Prioritize Privileged Instructions关键要点&#xff1a;快速浏览&#xff1a;1. 引言&#xff08;Introduction&#xff09;2. 指令层级&#xff08;The Instruction Hie…...

高效人脸关键点检测算法HRNet-Facial-Landmark-Detection

高效人脸关键点检测算法HRNet-Facial-Landmark-Detection 300 W data 数据标注格式 helen/trainset/1271089376_2.jpg,2.105,642.5,643.5,453.88947199999996,562.431791,457.882374,607.338625,471.39681399999995,655.136824,489.458724,702.023327,508.36972599999996,743.…...

LeetCode 3375 题解

题解 如题所示&#xff0c;允许暴力&#xff0c;虽然是暴力&#xff0c;但复杂度也就O(n) 还是如昨天的题目一样&#xff0c;使用Set.add的方法去判断即可 分三种情况 因为是set集合的原因&#xff0c;所以可以排除值相同的原因 当遍历数组有值小于k就return -1 当遍历数组遇…...

leetcode_数组 189. 轮转数组

189. 轮转数组 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3输出: [5,6,7,1,2,3,4] 示例 2: 输入&#xff1a;nums [-1,-100,3,99], k 2输出&#xff1a;[3,99,-1,-100] 思…...

MySQL | 三大日志文件

Undo Log&#xff08;回滚日志&#xff09; 实现原理与分类 原理&#xff1a;Undo Log 记录的是数据修改前的旧值&#xff0c;通过这些旧值可以将数据恢复到修改之前的状态。它采用的是逻辑日志&#xff0c;即记录的是如何撤销操作&#xff0c;而不是物理数据的实际值。 分类…...

GIS-AI 融合引擎架构:智慧景区导览系统的毫秒级响应与千级并发优化实战

本文面向 文旅行业技术决策者、GIS 开发者、AI 算法工程师&#xff0c;旨在解决传统景区导览系统 定位精度低、交互体验差、运营成本高 的核心痛点&#xff0c;提供从技术选型到落地部署的全链路解决方案。 如需获取智慧景区导览系统解决方案请前往文章最下方获取&#xff0c;如…...

WSA(Windows 安卓子系统)过检测教程

windows安卓子系统WSA的root和magisk的安装教程 安卓子系统WSLWSA的rootmagisk安装 WSA&#xff08;Windows 安卓子系统&#xff09;过检测的方法与思路 一、引言 Windows 安卓子系统&#xff08;WSA&#xff09;为 Windows 用户提供了在电脑上运行安卓应用的便利。然而&…...

Spark原理及代码

一、 Spark运行架构 运行架构 Spark 框架的核心是一个计算引擎&#xff0c;整体来说&#xff0c;它采用了标准 master-slave 的结构。 Spark 框架有两个核心组件&#xff1a; 1、Driver Spark 驱动器节点&#xff0c;用于执行 Spark 任务中的 main 方法&#xff0c;负责实…...

esp32cam -> 服务器 | 手机 -> 服务器 直接服务器传输图片

服务器先下载python &#xff1a; 一、Python环境搭建&#xff08;CentOS/Ubuntu通用&#xff09; 一条一条执行 安装基础依赖 # CentOS sudo yum install gcc openssl-devel bzip2-devel libffi-devel zlib-devel # Ubuntu sudo apt update && sudo apt install b…...

RHCSA Linux系统 数据流和重定向 tee 命令

一.数据流和重定向 1. 数据流 (1) 标准输入&#xff08;stdin&#xff0c;代码 0&#xff09;&#xff1a;默认从键盘获取输入&#xff0c;只读。 (2) 标准输出&#xff08;stdout&#xff0c;代码 1&#xff09;&#xff1a;命令执行正确信息默认输出到屏幕&#xff0c;只写…...

libev实现Io复用及定时器事件服务器

客户端和服务器都绑定在了enp2s0网卡&#xff0c;需要SERVER_IP和SERVER_PORT改为其ip&#xff0c;注意不能是127.0.0.1&#xff0c;因为这个是lo虚拟网口。 安装libev sudo apt-get install libev-dev客户端&#xff1a; #include <iostream> #include <string>…...

【项目实训项目博客】prompt初版实践

通过对camel技术的理解&#xff0c;我们向其中添加了市场营销角色的prompt 初版设计如下&#xff1a; chatchainconfig.json { "chain": [ { "phase": "DemandAnalysis", "phaseType": "SimplePhase", "max_turn_step…...

底盘---全向轮(Omni Wheel)

一、基本定义与起源 定义&#xff1a; 全向轮是一种通过在主轮外周安装多个 垂直于主轮轴线的横向小滚轮 实现多向移动的轮式结构。小滚轮可自由转动&#xff0c;允许设备在纵向&#xff08;主轮驱动方向&#xff09;和横向&#xff08;小滚轮滚动方向&#xff09;同时受力&…...

Python标准库json完全指南:高效处理JSON数据

一、json库概述 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式&#xff0c;Python的json模块提供了JSON数据的编码和解码功能。该模块可以将Python对象转换为JSON字符串&#xff08;序列化&#xff09;&#xff0c;也可以将JSON字符串转换为Python对象&#xf…...

用一个实际例子快速理解MCP应用的工作步骤

已经有很多的文章介绍MCP server&#xff0c;MCP Client工作原理&#xff0c;这里不做太多介绍。但是很多介绍都只是侧重介绍概念&#xff0c;实际的工作原理理解起来对初学者还是不太友好。本文以一个智能旅游咨询系统为例&#xff0c;详细说明在利用 Model Context Protocol&…...