Lua 第8部分 补充知识
8.1 局部变量和代码块
Lua 语言中的变量在默认情况下是全局变量 ,所有的局部变量在使用前必须声明 。 与全局变量不同,局部变量的生效范围仅限于声明它的代码块。一个代码块( block )是一个控制结构的主体,或是一个函数的主体,或是一个代码段(即变量被声明时所在的文件或字符串):
x = 10
local i = 1 -- 对于代码段来说是局部的while i <= x dolocal x = i*2 -- 对于循环体来说是局部的print(x)i = i + 1
endif i > 20 then local x -- 对于then来说是局部的x = 20print(x + 2) -- 如果测试成功输出22
elseprint(x) --> 10 (全局的)
endprint(x) --> 10 (全局的)
请注意,上述示例在交互模式中不能正常运行。 因为在交互模式中,每一行代码就是一个代码段(除非不是一条完整的命令)。 一旦输入示例的第二行, Lua 语言解释器就会直接运行它并在下一行开始一个新的代码段。 这样,局部( local )的声明就超出了原来的作用范围 。 解决这个问题的一种方式是显式地声明整个代码块, 即将它放入一对 do-end 中 。一旦输入了do,命令就只会在遇到匹配的 end 时才结束,这样 Lua 语言解释器就不会单独执行每一行的命令。
当需要更好地控制某些局部变量的生效范围时, do 程序块也同样有用:
local x1, x2
dolocal a2 = 2*a local d = (b^2 - 4*a*c)^(1/2)x1 = (-b + d)/a2x2 = (-b - d)/a2
end -- 'a2'和'd'的范围在此结束
print(x1, x2) -- 'x1'和'x2'仍在范围内
尽可能地使用局部变量是一种良好的编程风格。 首先,局部变量可以避免由于不必要的命名而造成全局变量的混乱;其次,局部变量还能避免同一程序中不同代码部分中的命名冲突;再次,访问局部变量比访问全局变量更快;最后,局部变量会随着其作用域的结束而消失,从而使得垃圾收集器能够将其释放。
鉴于局部变量优于全局变量,有些人就认为 Lua 语言应该把变量默认视为局部的。 然而,把变量默认视为局部的也有一系列的问题(例如非局部变量的访问问题)。一个更好的解决办法并不是把变量默认视为局部变量,而是在使用变量前必须先声明 。 Lua 语言的发行版中有一个用于全局变量检查的模块 strict.lua , 如果试图在一个函数中对不存在的全局变量赋值或者使用不存在的全局变量 ,将会抛出异常。 这在开发 Lua 语言代码时是一个良好的习惯。
局部变量的声明可以包含初始值,其赋值规则与常见的多重赋值一样:多余的值被丢弃 ,多余的变量被赋值为 nil 。 如果一个声明中没有赋初值,则变量会被初始化为 nil:
local a, b = 1, 10
if a < b thenprint(a) --> 1local a -- '= nil'是隐式的print(a) --> nil
end
print(a, b) --> 1 10
Lua 语言中有一种常见的用法:
local foo = foo
这段代码声明了一个局部变量 foo 然后用全局变量 foo 对其赋初值(局部变量 foo 只有在声明之后才能被访问)。 这个用法在需要提高对 foo 的访问速度时很有用。 当其他函数改变了全局变量 foo 的值,而代码段又需要保留 foo 的原始值时,这个用法也很有用,尤其是在进行运行时动态替换时。 即使其他代码把 print 动态替换成了其他函数,在 local print =print 语句之前的所有代码使用的还都是原先的 print 函数。
有些人认为在代码块的中间位置声明变量是一个不好的习惯,实际上恰恰相反:我们很少会在不赋初值的情况下声明变量 ,在需要时才声明变量可以避免漏掉初始化这个变量。 此外,通过缩小变量的作用域还有助于提高代码的可读性。
8.2 控制结构
Lua 语言提供了一组精简且常用的控制结构,包括用于条件执行的 if 以及用于循环的 while 、 repeat 和 for 。 所有的控制结构语法上都有一个显式的终结符: end用于终结 if 、 for 及 while 结构, until 用于终结 repeat 结构 。
控制结构的条件表达式的结果可以是任何值。 请记住,Lua 语言将所有不是 false 和 nil 的值当作真(特别地, Lua 语言将 0 和空字符串也当作真)。
8.2.1 if then else
if 语句先测试其条件,并根据条件是否满足执行相应的 then 部分或 else 部分。 else 部分
是可选的 。
if a < 0 then a = 0 endif a < b then return a else return b endif line > MAXLINES thenshowpage()line = 0
end
如果要编写嵌套的 if 语句,可以使用 elseif 。 它类似于在 else 后面紧跟一个 if,但可以避免重复使用 end:
if op == "+" then r = a + b
elseif op == "-" then r = a - b
elseif op == "*" then r = a * b
elseif op == "/" then r = a / b
elseerror("invalid operation")
end
由于 Lua 语言不支持 switch 语句,所以这种一连串的 else-if 语句比较常见。
8.2.2 while
顾名思义,当条件为真时 while 循环会重复执行其循环体。 Lua 语言先测试 while 语句的条件,若条件为假则循环结束;否则, Lua 会执行循环体并不断地重复这个过程。
local i = 1
while a[i] do print(a[i])i = i + 1
end
8.2.3 repeat
顾名思义, repeat-until 语句会重复执行其循环体直到条件为真时结束。 由于条件测试在循环体之后执行,所以循环体至少会执行一次。
-- 输出第一个非空的行
local line
repeatline = io.read()
until line ~= ""
print(line)
和大多数其他编程语言不同,在 Lua 语言中,循环体内声明的局部变量的作用域包括测试条件:
-- 使用Newton-Raphson计算'x'的平方根
local sqr = x / 2
repeatsqr = (sqr + x/sqr) / 2local error = math.abs(sqr^2 - x)
until error < x/10000 -- 局部变量error此时依然可见
8.2.4 数值型 for
for 语句有两种形式: 数值型 for 和泛型 for 。
数值型 for 的语法如下:
for var = exp1, exp2, exp3 dosomething
end
在这种循环中, var 的值从 exp1 变化到 exp2 之前的每次循环会执行 something ,并在每次循环结束后将步长 exp3 增加到 var 上。 第三个表达式 exp3 是可选的,若不存在, Lua语言会默认步长值为 1 。 如果不想给循环设置上限,可以使用常量 math.huge:
for i = 1, math.huge do if (0.3*i^3 - 20*i^2 - 500 >= 0) thenprint(i)breakend
end
为了更好地使用 for 循环,还需要了解一些细节。首先,在循环开始前, 三个表达式都会运行一次;其次,控制变量是被 for 语句自动声明的局部变量 ,且其作用范围仅限于循环体内 。一种典型的错误是认为控制变量在循环结束后仍然存在:
for i = 1, 10 do print(i) end
max = i -- 可能会出错!此处的'i'是全局的
如果需要在循环结束后使用控制变量的值(通常在中断循环时),则必须将控制变量的值保存到另一个变量中:
-- 在一个列表中寻找一个值
local found = nil
for i = 1, #a doif a[i] < 0 thenfound = i -- 保存'i'的值breakend
end
print(found)
最后,不要改变控制变量的值,随意改变控制变量的值可能产生不可预知的结果。 如果要在循环正常结束前停止 for 循环,那么可以参考上面的例子,使用 break 语句。
8.2.5 泛型 for
泛型 for 遍历迭代函数返回的所有值,例如我们已经在很多示例中看到过的 pairs 、ipairs 和 io.lines 等。 虽然泛型 for 看似简单,但它的功能非常强大。 使用恰当的迭代器可以在保证代码可读性的情况下遍历几乎所有的数据结构。
当然,我们也可以自己编写迭代器。 尽管泛型 for 的使用很简单 , 但编写迭代函数却有不少细节需要注意。
与数值型 for 不同,泛型 for 可以使用多个变量 , 这些变量在每次循环时都会更新。 当第一个变量变为 nil 时 ,循环终止。 像数值型 for 一样,控制变量是循环体中的局部变量 ,我们也不应该在循环中改变其值。
8.3 break 、 return 和 goto
break 和 return 语句用于从当前的循环结构中跳出, goto 语句则允许跳转到函数中的几乎任何地方。
我们可以使用 break 语句结束循环,该语句会中断包含它的内层循环(例如 for 、repeat或者 while );该语句不能在循环外使用 。 break 中断后,程序会紧接着被中断的循环继续执行。
return 语句用于返回函数的执行结果或简单地结束函数的运行。 所有函数的最后都有一个隐含的 return , 因此我们不需要在每一个没有返还值的函数最后书写 return 语句 。
按照语法, return 只能是代码块中的最后一句:换句话说,它只能是代码块的最后一句,或者是 end 、 else 和 until 之前的最后一句。 例如,在下面的例子中, return 是 then 代码块的最后一句 :
local i = 1
while a[i] doif a[i] == v then return i endi = i + 1
end
通常,这些地方正是使用 return 的典型位置, return 之后的语句不会被执行。 不过,有时在代码块中间使用 return 也是很有用的 。 例如,在调试时我们可能不想让某个函数执行。 在这种情况下,可以显式地使用一个包含 return 的 do:
function foo()return --<< SYNTAX ERROR-- 'return'是下一个代码块的最后一句do return end -- OKother statements
end
goto 语句用于将当前程序跳转到相应的标签处继续执行。 goto 语句一直以来备受争议,至今仍有很多人认为它们不利于程序开发并且应该在编程语言中禁止。不过尽管如此,仍有很多语言出于很多原因保留了 goto 语句 。goto 语句有很强大的功能,只要足够细心,我们就能够利用它来提高代码质量。
在 Lua 语言中 , goto 语句的语法非常传统, 即保留字 goto 后面紧跟着标签名,标签名可以是任意有效的标识符。 标签的语法稍微有点复杂:标签名称前后各紧跟两个冒号,形如 ::name:: 。 这个复杂的语法是有意而为的,主要是为了在程序中醒目地突出这些标签 。
在使用 goto 跳转时·,Lua 语言设置了一些限制条件。 首先,标签遵循常见的可见性规则,因此不能直接跳转到一个代码块中的标签(因为代码块中的标签对外不可见 ) 。 其次,goto
不能跳转到函数外(注意第一条规则已经排除了跳转进一个函数的可能性)。最后,goto 不能跳转到局部变量的作用域。
关于 goto 语句典型且正确的使用方式,请参考其他一些编程语言中存在但 Lua 语言中不存在的代码结构,例如 continue 、多级 break 、多级 continue 、redo 和局部错误处理等。continue语句仅仅相当于一个跳转到位于循环体最后位置处标签的 goto 语句,而 redo 语句则相当于跳转到代码块开始位置的 goto 语句:
while some_condition do::redo:: if some_other_condition then goto continueelse if yet_another_condition then goto redoendsome code ::continue::
end
Lua 语言规范中一个很有用的细节是,局部变量的作用域终止于声明变量的代码块中的最后一个有效 ( non-void )语句处 ,标签被认为是无效( void ) 语句。 下列代码展示了这个实用的细节:
while some_condition doif some_other_condition then goto continue endlocal var = somethingsome code ::continue::
end
可能有人认为,这个 goto 语句跳转到了变量 var 的作用域内 。 但实际上这个 continue 标签出现在该代码块的最后一个有效语句后,因此 goto 并未跳转进入变量 var 的作用域内 。
goto 语句在编写状态机时也很有用 。 示例 8.1 给出了一个用于检验输入是否包含偶数个0的程序。
示例 8.1 一个使用 goto 语句的状态机的示例
::s1:: dolocal c = io.read(1)if c == '0' then goto s2elseif c == nil then print ('ok'); returnelse goto s1end
end::s2:: dolocal c = io.read(1)if c == '0' then goto s1elseif c == nil then print('not ok'); returnelse goto s2end
endgoto s1
虽然可以使用更好的方式来编写这段代码,但上例中的方法有助于将一个有限自动机自动地转化为 Lua 语言代码。
再举一个简单的迷宫游戏的例子。 迷宫中有几个房间,每个房间的东南西北方向各有一扇门。 玩家每次可以输入移动的方向,如果在这个方向上有一扇门 , 则玩家可以进入相应的房间,否则程序输出一个警告,玩家的最终目的是从第一个房间走到最后一个房间 。
这个游戏是一个典型的状态机,当前玩家所在房间就是一个状态。 为实现这个迷宫游戏,我们可以为每个房间对应的逻辑编写一段代码,然后用 goto 语句表示从一个房间移动到另一个房间。示例 8.2展示了如何编写一个由 4 个房间组成的小迷宫。
示例 8.2 一个迷宫游戏
goto room1 -- 起始房间::room1:: dolocal move = io.read()if move == "south" then goto room3elseif move == "east" then goto room2elseprint("invalid move")goto room1 -- 待在同一个房间end
end::room2:: dolocal move = io.read()if move == "south" then goto room4elseif move == "west" then goto room1elseprint("invalid move")goto room2 -- 待在同一个房间end
end::room3:: dolocal move = io.read()if move == "north" then goto room1elseif move == "east" then goto room4elseprint("invalid move")goto room3 -- 待在同一个房间end
end::room4:: doprint("Congratulations, you win!")
end
对于这个简单的游戏,使用数据驱动编程(使用表来描述房间和移动)是一种更好的设计方法。 不过,如果游戏中的每间房都各自不同,那么就非常适合使用这种状态机的实现方法。
相关文章:
Lua 第8部分 补充知识
8.1 局部变量和代码块 Lua 语言中的变量在默认情况下是全局变量 ,所有的局部变量在使用前必须声明 。 与全局变量不同,局部变量的生效范围仅限于声明它的代码块。一个代码块( block )是一个控制结构的主体,或是一个函…...
Lua 第7部分 输入输出
由于 Lua 语言强调可移植性和嵌入性 , 所以 Lua 语言本身并没有提供太多与外部交互的机制 。 在真实的 Lua 程序中,从图形、数据库到网络的访问等大多数 I/O 操作,要么由宿主程序实现,要么通过不包括在发行版中的外部库实现。 单就…...
Java 中 == 和 equals() 的区别
1. 运算符 是 Java 中的比较运算符,用于比较两个变量的值是否相等,但具体行为取决于变量的类型: 类型 比较的内容基本类型直接比较值是否相等(如 int a 5; int b 5; a b 返回 true)引用类型比较内存地址&#x…...
Redis新节点加入集群会发生什么(面试题)
新加入主节点:会发生槽位数据重新分配迁移, 新加入从节点,会发生主从同步,全量同步和增量同步 当一个新节点加入 Redis 集群时,会触发一系列操作以确保集群的稳定性和数据的一致性。以下是新节点加入 Redis 集群时的详…...
dmncdm达梦新云缓存数据库主从集群安装部署详细步骤说明
dmncdm达梦新云缓存数据库主从集群安装部署详细步骤说明 1 环境介绍2 安装部署dmncdm2.1 196部署cdm环境2.2 197部署cdm环境2.3 190部署cdm环境 3 主备集群/主从集群配置4 部署主备集群/主从集群5 部署日志6 更多达梦数据库全方位指南:安装 优化 与实战教程 1 环境介绍 cpu x8…...
docker容器,mysql的日志文件怎么清理
访问问题 你的问题是因为在当前路径 /home/ictrek/data/ragflow-mysql 下没有名为 data 的子目录。以下是详细分析和解决方法: 错误原因 路径不存在 当前目录 /home/ictrek/data/ragflow-mysql 下没有名为 data 的子目录,执行 cd data/ 时会报错 No suc…...
kafka auto.offset.reset详解
在 Kafka 中,auto.offset.reset latest 的含义及行为如下: 1. 核心定义 当消费者组首次启动或无法找到有效的 offset(例如 offset 过期、被删除或从未提交)时,消费者会从分区的最新位置…...
设备制造行业如何避免项目管理混乱?
项目常因进度延误、成本超支或部门协作不畅而陷入混乱? 这不仅拖累项目交付,还可能损害客户信任和企业利润。设备制造行业的项目管理复杂多变,从需求获取到生产交付再到售后运维,每一个环节都可能成为效率的瓶颈。 如何破解这一…...
kubernetes》》k8s》》删除命名空间
使用 kubectl delete ns 命名空间 --force --grace-period0 如果还删除不掉 需要 kubectl get namespace 命名空间 -o json > x.json vim x.json kubectl replace --raw “/api/v1/namespaces/命名空间/finalize” -f ./x.json...
【深度学习新浪潮】新视角生成的研究进展调研报告(2025年4月)
新视角生成(Novel View Synthesis)是计算机视觉与图形学领域的核心技术,旨在从单张或稀疏图像中生成任意视角的高保真图像,突破传统多视角数据的限制,实现对三维场景的自由探索。作为计算机视觉与图形学的交叉领域,近新视角生成年来在算法创新、应用落地和工具生态上均取…...
55、Spring Boot 详细讲义(十一 项目实战)springboot应用的登录功能和权限认证
项目文档:springboot应用的登录功能和权限认证 一、项目概述 1. 项目简介 本项目是在一个基于Spring Boot的Web应用中实现登录功能和权限认证。要求实现登录功能,用户登录成功以后,会给前台返回当前登录用户可以访问的权限菜单,比如超级管理员可以访问所有权限,产品管理…...
react 父子组件通信 子 直接到父, 父 forwardref子
React核心概念:单向数据流(Unidirectional Data Flow) React 中数据的流动像瀑布一样,只能从上层组件(父组件)流向下层组件(子组件)。 子组件无法直接反向修改父组件的数据&#x…...
基于TCP的协议
目录 TCP 基于TCP的应用层协议: TCP的工作方式 TCP TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层协议。它为应用层提供了一个可靠的端到端的数据传输服务。再TCP/IP模型中,TCP位于传输层,负责再…...
性能比拼: Go vs Java
本内容是对知名性能评测博主 Anton Putra Go (Golang) vs Java: Performance Benchmark 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 在本视频中,我们将比较 Go 和 Java。 我们将基于 Golang 的 Fiber 框架和 Java 的 Spring Boot 创建几个简单的应用…...
【Spring】单例作用域下多次访问同一个接口
在Spring框架中,Controller和Service的Bean默认都是单例(Singleton)的。在多个请求同时访问Controller时,Service的Bean调用情况如下: 1. 核心机制 单例Bean:Spring容器为每个Bean定义(如Serv…...
数据库介绍
1、什么是数据库 数据库是一个“广义的概念" 1. 表示一门学科 2. 表示一类软件,管理数据的软件 3. 表示某一个具体的数据库软件 4. 表示部署了某个数据库软件的主机(电脑) 本专栏介绍的是具体的数据库软件:MySQL 数据库软件的主要功能是对数据的增删…...
Spring XML 配置
Spring XML 配置是 Spring Framework 的传统配置方式,通过 XML 文件定义 Bean、依赖注入、AOP 等核心功能。以下是详细的 Spring XML 配置解析: 一、基础配置 1. XML 配置文件结构 <?xml version"1.0" encoding"UTF-8"?> …...
AI数字人:品牌营销的新宠与增长密码(6/10)
摘要:AI数字人凭借低成本、高可控性与强互动性等优势,正成为品牌营销新宠。通过技术驱动,AI数字人从虚拟形象发展为智能交互的数字化身,广泛应用于直播、客服、内容生产等营销场景,助力品牌提升营销效果与用户互动体验…...
CentOS笔记本合上盖子不休眠
通过修改 /etc/systemd/logind.conf 文件中的 HandleLidSwitch 和 HandleLidSwitchDocked 设置为 ignore,可以实现合上笔记本盖子时不休眠的效果。如果有其他电源管理工具或桌面环境的设置干扰,也需要一并调整。 // 切换到root用户 su root// logind.co…...
Vue.js 之 `v-for` 命令详解
Vue.js 之 v-for 命令详解 在 Vue.js 中,v-for 是一个非常强大的指令,用于遍历数组或对象中的数据,并渲染相应的 DOM 元素。无论是在列表展示、表单生成还是动态组件加载中,v-for 都发挥着重要作用。本文将详细介绍 v-for 的用法…...
Linux命令-pidstat
pidstat命令是一个用于监控系统中各个进程活动的性能监控工具。它能够实时输出每个进程的 CPU、内存、I/O 等关键性能指标。以下是关于 pidstat 命令的详细介绍: 语法 pidstat [选项] [时间间隔] [次数]常用选项 -h 或 --help :显示帮助信息。 -v &…...
map和set
1.序列式容器和关联式容器 在认识map和set之前,关于容器,有两个重要的分类 序列式容器关联式容器 序列式容器:按照元素插入的顺序保存数据,关注元素的顺序和位置,因为逻辑结构为线性序列的数据结构,两个位…...
CentOS 6.9 安装 Zabbix 3.0 详细教程
一、引言 在 Linux 环境下,有许多实用的系统监控软件,如 Nagios、Cacti、Zabbix、Monit等。这些开源软件能帮助我们更好地管理机器,及时发现问题并警告系统维护人员。今天我们将重点研究 Zabbix,使用它的目的是为了更好地监控MySQ…...
通俗的理解TCP的三次握手四次挥手
前言 本文是博主根据自身理解,尽量用最通俗的形式解释TCP的三次握手四次挥手。 一、三次握手:为什么不是两次或四次? 1. 三次握手过程 SYN:客户端发送SYN1, seqx(我要连接)SYNACK:服务器回复…...
【Python进阶】正则表达式实战指南:从基础到高阶应用
目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 二、实战演示环境配置要求核心代码实现案例1:邮箱格式验证案例2:提取电话号码案例3:替换敏感信息 运行…...
linux下内存地址数学运算
如下代码计算地址并16字节对齐: char* buffer (char*)malloc(a3 0x1000);unsigned long long tmp (((unsigned long long)buffer 0x10) & 0xffffffffffffff00);char* buf (char*)tmp;假如把地址当作整数,加减程序运算,直接转换是不行…...
考研单词笔记 2025.04.22
abuse v/n滥用,妄用,虐待,伤害 adopt v采用,采纳,收养,领养,正式通过,批准 apply v应用,运用,申请,适用,有效 deploy v有效利用&am…...
JVM虚拟机-类加载器、双亲委派模型、类装载的执行过程
一、什么是类加载器,类加载器有哪些 我们目前要讲的就是类加载子系统,主要作用是将java源码编译为class字节码文件后装载到运行时数据区,运行时数据区就可以去分配内存再通过执行引擎来执行java代码。 启动类加载器(也称引导类加载器)&…...
神经网络的 “成长密码”:正向传播与反向传播深度解析(四)
引言 在神经网络的神秘世界里,正向传播和反向传播是驱动模型学习和进化的核心机制。它们如同神经网络的 “左右脑”,正向传播负责信息的前向流动与初步处理,反向传播则通过优化权重参数来提升模型性能,二者相辅相成,共…...
激活函数:神经网络的 “魔法开关”,开启智能之门(三)
引言 在神经网络的复杂架构中,激活函数扮演着至关重要的角色,堪称神经网络的 “魔法开关”。它赋予了神经网络强大的能力,让其能够处理各种复杂的任务。本文将深入剖析激活函数的重要性、引入原因、常见类型以及选择策略,并针对面…...
服装印花/印烫环节计算机视觉应用设计方案
服装印花/印烫环节计算机视觉应用设计方案 一、引言 随着消费者对服装个性化、多样化需求的增加,服装印花/印烫环节作为服装生产中的重要一环,其质量和效率直接影响到产品的竞争力和市场占有率。传统的服装印花/印烫环节存在以下痛点: 人为…...
vue3:十一、主页面布局(修改左侧导航条的样式)
一、样式 1、初始样式 2、 左侧导航栏搭建完成样式 二、实现 1、设置左侧导航栏底色 (1)去掉顶部和左侧导航栏的底色 初始页面效果 顶部与左侧底色样式 将代码中与顶部与左侧的样式删掉 移除后页面效果 加入设定背景色 #f4f6f9 加入底色后颜色展示 (2)去除菜单项底色 初…...
Sentinel源码—8.限流算法和设计模式总结二
大纲 1.关于限流的概述 2.高并发下的四大限流算法原理及实现 3.Sentinel使用的设计模式总结 3.Sentinel使用的设计模式总结 (1)责任链模式 (2)监听器模式 (3)适配器模式 (4)模版方法模式 (5)策略模式 (6)观察者模式 (1)责任链模式 一.责任链接口ProcessorSlot 二.责…...
Docker 部署 MySQL 数据库
Docker 部署 MySQL 数据库 基于 Docker 部署 MySQL 数据库一、拉取 MySQL 镜像二、运行 MySQL 容器三、运行命令参数详解四、查看容器运行状态 基于 Docker 部署 MySQL 数据库 一、拉取 MySQL 镜像 在开始之前,请确保你的 Docker 环境已经正确安装并可以正常运行。…...
【Linux运维涉及的基础命令与排查方法大全】
文章目录 前言1、计算机网络常用端口2、Kali Linux中常用的命令3、Kali Linux工具的介绍4、Ubuntu没有网络连接解决方法5、获取路由6、数据库端口 前言 以下介绍计算机常见的端口已经对应的网络协议,Linux中常用命令,以及平时运维中使用的排查网络故障的…...
映射(Mapping)和地址(Address)
Addresses (地址) 以太坊区块链由 _ account _ (账户)组成,你可以把它想象成银行账户。一个帐户的余额是 以太 (在以太坊区块链上使用的币种),你可以和其他帐户之间支付和接受以太币,就像你的银…...
用Java实现简易区块链:从零开始的探索
📢 友情提示: 本文由银河易创AI(https://ai.eaigx.com)平台gpt-4o-mini模型辅助创作完成,旨在提供灵感参考与技术分享,文中关键数据、代码与结论建议通过官方渠道验证。 区块链技术作为近年来的热门话题&am…...
Spark-Streaming
Spark-Streaming 一、Spark-Streaming简介 1、Spark-Streaming概述 1.1、Spark-Streaming是什么 Spark Streaming 用于流式数据的处理。Spark Streaming 支持的数据输入源很多,例如:Kafka、Flume、Twitter等,以及和简单的 TCP 套接字等等…...
工程投标k值分析系统(基于微服务实现)
1 需求总括 2 企业管理模块: 新增、删除、修改企业/部门 <...
WebGL 工作原理
WebGL在GPU上的工作基本上分为两部分 第一部分是将顶点(或数据流)转换到裁剪空间坐标 就是将传入的位置坐标,转换为0-1的值,并绘制出来每个顶点的坐标(传入的值)通过顶点着色器计算转换为裁剪空间坐标转换…...
【 React 】重点知识总结 快速上手指南
react 是 facebook 出的一款针对视图层的库。react 使用的是单向数据流的机制 React 官方中文文档 基础 api 和语法 jsx 语法 就是在 js 中插入 html 片段 在 React 中所有的组件都是 function 组件定义 function 定义组件 就是使用 function 定义组件 任何一个 function …...
Docker 部署 Redis 缓存服务
Docker 部署 Redis 缓存服务 基于 Docker 部署 Redis 缓存服务一、拉取 Redis 镜像二、运行 Redis 容器三、运行命令参数详解四、查看容器运行状态 基于 Docker 部署 Redis 缓存服务 一、拉取 Redis 镜像 确保 Docker 环境已正确安装并运行,打开终端执行以下命令拉…...
A2A + MCP:构建实用人工智能系统的超强组合
构建真正有效的连接型人工智能系统的挑战 如果你正在构建人工智能应用,这种情况可能听起来很熟悉: 你需要特定的人工智能能力来解决业务问题。你找到了完成每个单独任务的出色工具。但把所有东西连接在一起却占据了大部分开发时间,还创建了…...
全能 Sui 技术栈,构建 Web3 的未来
本文翻译自:FourPillarsFP,文章仅代表作者观点。 2025 年,SuiNetwork正在以一套全栈区块链策略强势出击,彻底打破加密行业的传统范式。正如 Mysten Labs 联合创始人 Adeniyi Abiodun 所说:“Sui 不只是一条区块链&…...
企业微信私域运营,基于http协议实现SCRM+AI完整解决方案
1、方案介绍 基于企业微信原生功能已实现全场景的能力覆盖,并提供标准化可直接调用的API接口,可以帮助企业轻松实现上层应用的开发及落地,方案采用模拟通信技术可实现PC,手机,ipad三端的同时在线,单服务器…...
【C++】Json-Rpc框架项目介绍(1)
项目介绍 RPC(Remote Procedure Call)即远程过程调用,是一种通过网络从远程计算机程序中请求服务而不需要了解底层网络实现细节的一种 协议 。 RPC(Remote Procedure Call)可以使用多种网络协议进行通信,如…...
数据结构图论基础知识(一)
文章目录 1. 图的基本概念2. 图的一些现实的应用2.1 ABCDE各个城市之间的关系2.2 社交关系 3. 图的存储结构3.1邻接矩阵3.2 邻接矩阵的实现3.3 邻接表 1. 图的基本概念 1. (graph)图由边(edge)和顶点(Vertexÿ…...
安宝特案例 | AR如何大幅提升IC封装厂检测效率?
前言:如何提升IC封装厂检测效率? 在现代电子产品的制造过程中,IC封装作为核心环节,涉及到复杂处理流程和严格质量检测。这是一家专注于IC封装的厂商,负责将来自IC制造商的晶圆进行保护、散热和导通处理。整个制程繁琐…...
2024年ESWA SCI1区TOP:量子计算蜣螂算法QHDBO,深度解析+性能实测
目录 1.摘要2.蜣螂优化算法DBO原理3.改进策略4.结果展示5.参考文献6.代码获取 1.摘要 蜣螂优化算法是一种群体智能优化算法,具有较强的优化能力和快速收敛性,但容易在优化过程后期陷入局部最优解。本文提出了一种量子计算和多策略混合的蜣螂优化算法&am…...
数据结构*链表- LinkedList
什么是链表 相较于ArrayList顺序表来说,链表是物理存储结构上非连续存储结构(也就是地址不是连续的)。链表由一系列节点构成,每个节点包含数据和指向下一个节点的引用。链表的各个节点在内存里并非连续存储,而是通过引…...