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

lua语法

lua语法

1.lua数据类型

lua 脚本输出乱码,将lua脚本改为UTF-8编码,并且需要DOS下修改代码页:CHCP 65001 即可。

image-20231218210209855

基本语法

注释

print("script lua win")-- 单行注释--[[多行注释]]--

标识符

类似于:java当中 变量、属性名、方法名。

以字母(a-z,A-Z)、下划线 开头,后面加上0个或多个 字母、下划线、数字。

不要用下划线+大写字母。

保留字。

总结一点:按照正常思维命名即可。

全局变量

print(a) -- nil
a=1
print(a)
a=nil --销毁a
print(a)
  • nil

没有任何有效值,就是一个 nil。 可以用于删除

print("---delete---")
-- 定义一个table
myTab = {key1="value1",key2="value2"}
for k,v in pairs(myTab) doprint(k.."_"..v)
endprint("---after delete---")
myTab.key1=nil
for k,v in pairs(myTab) doprint(k.."_"..v)
endprint("---判断是否为nil")
print(x) -- nil
print((type(x)==nil)) -- false
print(type(x)=='nil') -- true

image-20231215163327032

  • boolean

lua会将false(false\nil) 看做是false, 其他的都看做是 true(其他都为true,包括0)

print("---boolean---")print(type(true))  -- boolean
print(type(false)) -- boolean
print(type(nil))  -- nilif false or nil thenprint("nil被当为true")
elseprint("nil为false") -- false
endprint("---测试0---")
if 0 then print("0 是true") -- true
else print("0 是false")
end
  • number

双精度(8个字节)。

print("---------测试number-------------")
a = 10
print(type(a))
  • String

字符串用单引号或双引号来表示。

print("双引号字符串")print("单引号字符串")

用 [[可以换行的字符串 ]]

i = [[我是中国人,我爱我的祖国!]]print(i)

字符串和数字进行数学运算,优先将 字符串 转 成 数字。

print("1" + 2) -- 3print("1" + "2") -- 3print("1+2") -- 1+2-- 非数字的字符串和数字进行计算,则会报错-- lua: string.lua:1: attempt to perform arithmetic on a string value
print("error"+1)

字符串连接

-- error1
print("error"..1)

计算字符串长度(#字符串)

testLenth = "abcde"print("testLenth的长度为:"..#testLenth)
  • table

类比成java当中:数组,map,链表,队列等。

table的key的索引,从1开始。

print("---------测试 table-------------")
tab1 = {}tab2 = {"a","b","c"}tab3 = {key1="value1", key2 = "value2"}
print("tab3-:")
for k,v in pairs(tab3) doprint(k.."="..v)
end 
print("tab3:")tab1["a_key"]="a_value"
for k,v in pairs(tab1) doprint(k.."="..v)
end for k,v in pairs(tab2) doprint(k.."="..v)
end 
-- table的key的索引,从1开始。
-- 1=a
-- 2=b
-- 3=c-- 删除table中的元素
print("tab3-:")
tab3["key2"] = nil
for k,v in pairs(tab3) doprint(k.."="..v)
end 
print("tab3:")
  • function

阶乘:

function factorial(n)if n == 0 thenreturn 1elsereturn n * factorial(n - 1)end
end
testFac = factorial
print("6的阶乘结果:"..testFac(6))

匿名函数

print("------------匿名function-------------")
-- 定义函数
function testPrint(tab, func)for k,v in pairs(tab) doprint(func(k,v))end
end-- 定义数组调用函数
tab1 = {"a","b","c"}
testPrint(tab1,function(k,v)return k.."="..vend
)

2.变量赋值

a = 变量值。

print("---变量赋值---")
a,b=1,2
a = 1+2
print(a,b) -- 3  2

常用:x , y = y, x

a,b,c=1,2
print(a,b,c) -- 1       2       nil

变量个数 > 值的个数:按照变量的个数 补足 nil。

a,b,c = 1,2,3,4
print(a,b,c) -- 1       2       3

变量个数<值的个数:多余的值会被忽略。

a,b = 1,2
function var() a = nilb = 3local c = 4print(c) -- 4return a,b
enda,b = var()
print(a,b,c) -- nil     3       nil

多变量赋值:还可以用于函数的返回, 参数值互换。

a,b = func();

需要赋值给变量,如果能用局部变量,尽量用局部变量。

3.索引

lua索引中的下标是从1开始的

对table中元素的访问。

tab[“key”]

tab.key

print("-----------索引--------------")
tab = {key1 = "中国",key2 = "美国"}
print(tab["key1"]) -- 中国
print(tab.key2) --美国

4.循环

用途:做一些有规律的重复操作。
循环体:一组被重复执行的语句。循环条件:判断能否继续循环。

while循环

while(循环条件)
do
业务代码;
对循环条件的控制;
end
a = 1
while(a<5)
doprint(a)a = a+1
end

for循环

数值for循环:
for var=exp1,exp2,exp3 do
循环体
end

var的值,从exp1一直到exp2,步长是exp3(是可选的,默认是1)

print("----for----")
for i=1,10,2 doprint(i) -- 1 3 5 7 9
end

exp1,exp2,exp3 只在循环开始前计算一次。

print("----for----")
for i=1,test(2) doprint(i) -- 1 2 3 4
end

泛型for循环:

是通过迭代器进行的。

a = {"one","two","three"}
for k,v in pairs(a) doprint(v)
end

repeat until

repeat
循环体
until(条件)
先执行循环体,直到满足条件。如果条件为false,继续执行循环体,如果条件为true,则跳出循
环。
a = 1
repeat a = a+1print(a)
until(a>5)
print(a)--6

5.流程控制

if()

print("-----------if-------------")
a = 1
if(a == 1) thenprint(a.."是1")
end

0 是 true。

6.函数

函数定义

print()

功能:1。完成指定的任务。2。计算并返回值(可以返回多个值)。

函数的范围(local ,缺省) function 函数名称(参数列表)函数体;return 结果end

定义一个函数:实现求两个数的最大值。

print("---------------函数定义:求最大值---------------")
function testMax(num1,num2)if (num1 > num2) thenresult = num1;elseresult = num2;endreturn result;
end
print("15,20中的最大值是:"..testMax(15,20)) -- 20

函数可以作为参数进行传递。

例子:自定义打印函数。

print("---------------函数定义:自定义打印函数---------------")
myPrint = function(p)print("重新的打印函数:",p)
end;
myPrint("test");
function add(num1,num2,myPrintParam)result = num1 + num2;myPrintParam(result);
end
add(2,3,myPrint)

image-20231218215001500

多值返回

print("---------------多值返回---------------")
startIndex,endIndex = string.find("www.llp.com","llp")
print(startIndex , endIndex) -- 5       7

例子:找出一个数组中,最大的值,以及它的索引。

print("---------------找出数组中,最大的值,以及索引---------------")
function testMax(a)local iIndex = 1;local iValue = a[iIndex];for i,v in pairs(a) doif v > iValue theniIndex = i;iValue = v;endendreturn '最大值的索引:'..iIndex , '最大值是:'..iValue
end
print(testMax({1,4,8,2,7,10,6,3})) -- 最大值的索引:6 最大值是:10

可变参数

例子:求和

print("---------------可变参数:求和---------------")
function add1(...)local result = 0;for i,v in pairs(...) doresult = result + v;endreturn result;
end
print(add1({1,2,3,4,5})) -- 这里传入的是一个固定的数组

这个参数只有一个,不是可变的。

function add1(...)local result = 0;for i,v in pairs({...}) doresult = result + v;endreturn result;
end
print(add1(1,2,3,4))  -- 这样才是可变的

如何确定可变参数的数量,用#

例子:求平均数

print("---------------可变参数:求平均数---------------")
function average1(...)local result = 0;arg = {...}for i,v in pairs(arg) doresult = result + v;endnum = #argprint("参数的个数: "..num) -- 6return result / num;
end
print(average1(1,2,3,4,5,6)) -- 3.5

用select获取可变参数的数量

function average1(...)local result = 0;arg = {...}for i,v in pairs(arg) doresult = result + v;endnum = select("#",...)print("个数是:"..num) -- 5return result / num;
end
print(average1(1,2,3,4,5)) -- 3

函数的参数中,有固定参数,也有可变参数。固定参数写前面。

例子:固定参数和可变参数结合。用某个格式,输出可变参数。

print("---------------固定参数和可变参数结合---------------")
function fmtPrint(fmt,...)io.write(string.format(fmt,...))
end
fmtPrint("%d\t%d\n%d",2,3,4)

image-20231219093326957

选取可变参数的值

print("---------------选取可变参数中的值---------------")
function testSelect(...)a,b,c = select(3,...)print(a,b,c) -- 3 4 5
end
testSelect(1,2,3,4,5)

7.运算符

  • 算术运算符
+-*/% 取余
^ 乘幂
- 负号
  • 关系运算符
== 等于。
~=不等于
> 大于
< 小于
>= 大于等于
<= 小于等于
  • 逻辑运算符
and 
or
not
  • 其他运算符
.. 连接符
# 计算字符串或者 表 的长度。

8.数组

数组:相同元素的集合。

索引用整数表示:从1开始。

print("------多维数组--------")
testArray2 = {}
for i=1,3,1 dotestArray2[i]={}for j=1,2,1 dotestArray2[i][j] = i*jend
endfor i=1,3 dofor j=1,2 doprint(testArray2[i][j])endprint("------")
end

9.迭代器

泛型 for 迭代器

a = {"a","b","c"}
for k,v in pairs(a)
doprint(k,v)
end
a = {"a",key2="b","c"}
for k,v in ipairs(a)
doprint(k,v)
end

image-20231219101110690

pairs会遍历所有key和值。

ipairs:只会从1开始,步长是1,中间不是数字作为key的元素会被忽略,一直到第一个不连续的数

字索引为止(不含)。适合遍历数组。

for迭代器的结构:

for 变量列表 in 迭代函数 ,状态常量,控制变量

do

循环体

end

print("-------迭代器的定义例子--------")
-- 求平方 1-9的平方
function square(iteratorMaxCount,currentNumber)if currentNumber < iteratorMaxCount thencurrentNumber = currentNumber +1return currentNumber,currentNumber*currentNumberend
endfor i,n in square ,9,0
do
print(i,n)
end

image-20231219102741398

10.table

a = {key1=“a”,key2=“b”}

不能用nil做索引。

-- table
-- 初始化
myTable = {}
myTable[1] = "1"
-- 删除
myTable = nil
print("--------------------")
myTab = {}
print("myTab的类型是:"..type(myTab))
myTab[1]="1号元素"
myTab["a"]="a元素"
print("myTab[1]的元素是:"..myTab[1])
print("myTab['a']的元素是:"..myTab["a"])
-- 将myTab赋值
newMyTab = myTab;
print("newMyTab[1]的元素是:"..newMyTab[1])
print("newMyTab['a']的元素是:"..newMyTab["a"])
-- 修改元素
newMyTab["a"]="新值"
print("myTab['a']的元素是:"..myTab["a"])
print("newMyTab['a']的元素是:"..newMyTab["a"])
-- 置为nil
myTab = nil
print(myTab)
print("newMyTab[1]的元素是:"..newMyTab[1])
print("newMyTab['a']的元素是:"..newMyTab["a"])
myTab的类型是:table
myTab[1]的元素是:1号元素
myTab['a']的元素是:a元素
newMyTab[1]的元素是:1号元素
newMyTab['a']的元素是:a元素
myTab['a']的元素是:新值
newMyTab['a']的元素是:新值
nil
newMyTab[1]的元素是:1号元素
newMyTab['a']的元素是:新值

11.模块

模块的定义

从lua5.1开始,引入了模块机制,把一些公用的代码放到文件中,通过api的方式,让其他程序调用,这个文件,就是一个模块。

类似于java中的jar包。

lua中的模块,其实是一个table(由 变量、函数等已知的 lua元素组成)。最后在模块的结尾,需要返回一个table。

如何编写模块

文件名:module.lua

-- 模块 :module.lua
module = {}
module.constant = "模块中的常量"
function module.func1()print("这是函数1")
end
-- 这块,注意 module不能写。私有函数外部是无法访问的,需要通过其他公共的函数进行调用
local function func2()print("这是私有函数2")
end
function module.func3()func2()
end
-- 返回表 ,一定要注意返回table
return module

require函数

前面我们定义好了一个模块,那么模块应该如何调用呢,引入模块有如下两种方式:

require(“模块名”)

require “模块名”

-- 调用模块
require("module")
print(module.constant)
module.func3()

image-20231219110641747

12.元素

元表的定义

允许我们改变table的行为。

setmetatable(普通表,元表)

-- 元表
a = {"a","b","c"} -- 普通表
b = {} --元表
c = setmetatable(a,b)
print("------------------------")
f = {}
print("f:",f)
d = setmetatable({"c","d"},f)
print(d[1]) 
e = getmetatable(d)
print("e:",e)

image-20231219124517662

index元方法

__index (两个下划线)

定义普通表 p。

给普通表p,设置元表y,而元表y中有__index,__index=一个表 i,i中有 我们访问的那个不存在的key。

__index=表

print("-------------测试__index---------------")
-- 普通表
tab1 = {"a","b","c"}
print(tab1[5]) -- nil
-- 普通表,有一个元素 5="e"
newTab = {}
newTab[5] = "e"
metaTab1 = {__index=newTab}
setmetatable(tab1, metaTab1)
print(tab1[5]) -- e--index=函数(表,key)
-- 普通表
tab1 = {"a","b","c"}
print(tab1[5]) -- nil
print("原始的tab1:",tab1) -- 原始的tab1:     table: 00CF92E0
metaTab1 = {__index=function(tab, key )print("参数当中的tab:",tab) -- 参数当中的tab:  table: 00CF92E0print("参数当中的key:",key) -- 5if(key == 5) thenreturn "index--5"endend
}
setmetatable(tab1, metaTab1)
print(tab1[5]) --  index--5

请求表中key的值:

先在普通表中找,有返回,没有,看元表。

如果元表有__index, 且 __index中有对应的key。

如果没有,继续找__index的function。

newindex元方法

对表进行更新时调用

函数用法

print("-----------newindex--------------")
mytab2 = {"a","b"}
metatab2 = {__newindex = function(tab, key ,value)print("被调用") -- tab[key] = valuerawset(tab,key,value) --给table的key赋value的值end
}
setmetatable(mytab2,metatab2)
mytab2[3]="c"
print(mytab2[3]) -- c

image-20231219130359264

mytab2 = {"a","b"}
mytab21 = {}
metatab2 = {__newindex = mytab21
}
setmetatable(mytab2,metatab2)
mytab2[3]="c"
print(mytab2[3]) -- nil
print(mytab2[3]) -- nil

为表添加操作符

加法操作

print("-------------操作符------------")
tab3 = {"1","2"}
tab4 = {"a","b","c"}
metatab3 = {__add = function(tab1,tab2)local m = #tab1for k,v in pairs(tab2)dom = m+1tab1[m] = vendreturn tab1end
}
setmetatable(tab3,metatab3)
v = tab3 + tab4
print(v)
for k,v in pairs(v)
doprint(k,v)
end

__add:+

__sub: -

_mul:*

__div: /

__mod: %

__concat: …

__eq:==

__lt: <

_le: <=

call元方法

lua中,当表被当成函数调用时,会触发。

print("-----------call-------------")
tab_a1 = {"a","b"}
print("tab_a1原始值:",tab_a1)
tab_a2 = {"1","2"}
metatab_a = {__call = function(tab, ...)
local a = {...} 
for k,v in pairs(a) do print(v) end 
end
}
setmetatable(tab_a1,metatab_a)
result = tab_a1(6,7,8)

image-20231219160701242

tostring

用于修改表的输出行为。类似于java中的toString()。

print("-----------call-------------")
tab_a1 = {"a","b","c","d"}
print("tab_a1原始值:",tab_a1)
tab_a2 = {"1","2"}
metatab_a = {__call = function(tab, ...)local a = {...}for k,v in pairs(a) doprint(v)endend,__tostring = function(tab)local str = ""for k,v in pairs(tab) dostr = str..v..","endreturn strend
}
setmetatable(tab_a1,metatab_a)
-- result = tab_a1(6,7,8)
print(tab_a1)

ps:每个元方法之间 用 ,

13.协同程序

类似于 多线程的概念。

协程和线程的区别:

一个多线程的程序,可以同时运行多个线程。而协程呢,在某个时刻,只有一个协程在运行。

线程由cpu调度,协程由代码调度。

创建协程,并运行:

-- 定义协程
testAdd = coroutine.create(function(a,b)print(a+b) --3end
)-- 启动协程
-- 原来暂停-》执行,原来执行-》暂停
coroutine.resume(testAdd, 1,2)

wrap,这种方式运行协程只需要调用就可以执行

co = coroutine.wrap(function(a)print("参数值是:"..a)end
)
co(2)

启动、停止

testAdd = coroutine.create(function(a,b)print("执行--子方法",a+b)coroutine.yield();print("执行--子方法",a-b)end
)
coroutine.resume(testAdd, 1,7) -- 8
print("执行主方法")
coroutine.resume(testAdd) -- -6

image-20231219162739820

返回值

testAdd = coroutine.create(function(a,b)print("协程执行",a+b)coroutine.yield()return a+b,a-bend
)
r1,r2,r3 = coroutine.resume(testAdd, 1,7)
print("返回值:",r1,r2,r3)
r1,r2,r3 = coroutine.resume(testAdd, 1,7)
print("重新执行,返回值:",r1,r2,r3)

image-20231219163316441

协程状态

testAdd = coroutine.create(function(a,b)print("运行中 协程状态:",coroutine.status(testAdd))coroutine.yield() -- 放弃协程return a+b,a-bend
)
print("刚定义好的协程状态:",coroutine.status(testAdd))
r1 = coroutine.resume(testAdd,1,4)
print("启动协程结果:",r1)
print("最终的 协程状态:",coroutine.status(testAdd))
print("yield后 协程状态:",coroutine.status(testAdd))
r1 = coroutine.resume(testAdd,1,4)
print("二启动协程结果:",r1)
print("二最终的 协程状态:",coroutine.status(testAdd))
r1 = coroutine.resume(testAdd,1,4)
print("三启动协程结果:",r1)

结果:

刚定义好的协程状态:     suspended
运行中协程状态:       running
启动协程结果:  		 true
最终的协程状态:       suspended
yield后协程状态:     suspended
二启动协程结果:        true
二最终的协程状态:     dead
三启动协程结果:        false

协程协作

协程唯一标识

-- 协程内外部协作的例子
function foo(a)print("foo 参数:",a)return coroutine.yield(a*2)
end
co = coroutine.create(function(a,b)print("第一次启动协程,参数:",a,b)local r = foo(a+1)print("第二次启动协程,参数",r)local x,y = coroutine.yield(a+b,a-b)print("第三次启动协程,参数",x,y)return b,"协程结束啦"end
)
print("主程序:",coroutine.resume(co,1,5))
print("----分隔符---")
print("主程序:",coroutine.resume(co,"r"))
print("----分隔符---")
print("主程序:",coroutine.resume(co,"x","y"))
print("----分隔符---")
print("主程序:",coroutine.resume(co))

image-20231219170205916

协程内部和外部协作的例子:

第一次resume,传入的参数是 function的参数。

第一次yield的参数,是第一次resume的返回值。

第二次resume的参数,是第一次yield的 返回值。

生产者消费者问题

思路:

  1. 生产者生产完 产品,(自己停下来),等待消费者消费。
  2. 消费者消费完产品,(自己停下来),等待生产者生产。
-- 生产者和消费者
function productor()-- 定义生产的商品,用数字来替代local i = 0while i<100doi = i+1print("生产了:",i)-- 通过协程实现coroutine.yield(i)end
endfunction consumer()while truedo-- 从生产者获取产品local status,result = coroutine.resume(po)print("消费了:",result)if (result == 99) thenbreakendend
end
-- 程序开始
po = coroutine.create(productor)
consumer()

14.错误处理

语法错误:

-- 错误处理
a==10
for a = 1,10
print(a)
end

程序无法运行。

运行错误:

错误处理 assert和error

assert:

第一个参数为true,不输出第二个参数。

第一个参数为false,输出第二个参数。

function add(a,b)assert(b,"b是nil")
end
add(1)

error

function add(a,b)if(b==2) thenerror("报error了")endprint("正常执行")
end
add(1,2)

当error或assert,触发错误时,程序退出。

错误处理pcall

pcall(要执行的函数,函数需要的参数)

如果函数执行没问题,返回true

如果函数执行有问题,返回false。

function add(a,b)c = a+bprint("正常执行")
end
if pcall(add,1) thenprint("add 正常")
elseprint("add 错误")
end
print("主程序")--运行结果
add 错误
主程序

image-20231219171946830

错误处理xpcall

function testXpcall()c = 1+nil
end
function testErrorHandle(error)print("我来处理错误",error)
end
xpcall(testXpcall,testErrorHandle)

image-20231219171914201

15.面相对象

对象:属性、方法。

table,function。

student = {name = "张三",age = 18,
gotoSchool = function(name)print(name.."上学")
end}
--[[
下面两种方式也是支持的
student.gotoSchool = function(name)print(name.."上学")
end
function student.gotoSchool(name)print(name.."上学")
end
]]--
print("学生姓名:"..student.name..",年龄是:"..student.age)
student.gotoSchool(student.name)

技巧冒号

1。类比:一个类,实例化多个对象。

Student = {name="默认名称"}
function Student:new()s = {}setmetatable(s,{__index = self})return s
ends1 = Student:new()
s2 = Student:new()
s1.name="张三"
s2.name="李四"
print(s1.name)
print(s2.name)

image-20231219173247964

相关文章:

lua语法

lua语法 1.lua数据类型 lua 脚本输出乱码&#xff0c;将lua脚本改为UTF-8编码&#xff0c;并且需要DOS下修改代码页&#xff1a;CHCP 65001 即可。 基本语法 注释 print("script lua win")-- 单行注释--[[多行注释]]--标识符 类似于&#xff1a;java当中 变量、…...

5A-Downloader,m3u8文件转mp4文件,音视频分离ts合并、转mp4

获取方式: 1.https://www.pgyer.com/DpxhpE 2.https://github.com/JoeLeeto/5A-Downloader 3.https://play.google.com/store/apps/details?idcom.leet.downloader...

标准IO与文件IO

标准IO通过缓冲机制减少系统调用&#xff0c;实现更高的效率 全缓冲&#xff1a;当流的缓冲区无数据或无空间时才执行实际IO操作 行缓冲&#xff1a;当在输入和输出中遇到换行符&#xff08;\n&#xff09;时&#xff0c;进行IO操作 当流和一个终端关联时&#xff0c;典型的行缓…...

流行的 React 相关库和框架

React 本身就是一个非常流行的 JavaScript 库&#xff0c;用于构建用户界面&#xff0c;特别是单页面应用。不过&#xff0c;有许多其他的库和框架与 React 结合使用&#xff0c;以提供额外的功能和优化开发体验。以下是一些最流行的 React 相关库和框架&#xff1a; Next.js&a…...

游戏引擎?

游戏引擎是指一些已编写好的可编辑电脑游戏系统或者一些交互式实时图像应用程序的核心组件。这些系统为游戏设计者提供各种编写游戏所需的各种工具&#xff0c;其目的在于让游戏设计者能容易和快速地做出游戏程式而不用由零开始。大部分都支持多种操作平台&#xff0c;如Linux、…...

C语言--字符函数与字符串函数

大家好&#xff0c;我是残念&#xff0c;希望在你看完之后&#xff0c;能对你有所帮助&#xff0c;有什么不足请指正&#xff01;共同学习交流 本文由&#xff1a;残念ing 原创CSDN首发&#xff0c;如需要转载请通知 个人主页&#xff1a;残念ing-CSDN博客&#xff0c;欢迎各位…...

整理了一些热门、含免费次数的api,分享给大家

IP归属地-IPv4区县级&#xff1a;根据IP地址查询归属地信息&#xff0c;包含43亿全量IPv4&#xff0c;支持到中国地区&#xff08;不含港台地区&#xff09;区县级别&#xff0c;含运营商数据。IP应用场景- IPv4&#xff1a;IPv4应用场景是获取IP场景属性的在线调用接口&#x…...

Wireshark在网络性能调优中的应用

第一章&#xff1a;Wireshark基础及捕获技巧 1.1 Wireshark基础知识回顾 1.2 高级捕获技巧&#xff1a;过滤器和捕获选项 1.3 Wireshark与其他抓包工具的比较 第二章&#xff1a;网络协议分析 2.1 网络协议分析&#xff1a;TCP、UDP、ICMP等 2.2 高级协议分析&#xff1a;HTTP…...

关于设计师的自我评价(合集)

设计师的自我评价篇一 本人接受过正规的美术教育&#xff0c;具有较好的美术功底及艺术素养&#xff0c;能够根据公司的需要进行设计制作&#xff0c;熟练掌握多种电脑制作软件&#xff0c;能够高效率地完成工作。本人性格开朗、思维活跃、极富创造力&#xff0c;易于沟通&…...

Hudi Clustering

核心概念 Hudi Clustering对于在数据写入和读取提供一套相对完善的解决方案。它的核心思想就是&#xff1a; 在数据写入时&#xff0c;运行并发写入多个小文件&#xff0c;从而提升写入的性能&#xff1b;同时通过一个异步&#xff08;也可以配置同步&#xff0c;但不推荐&…...

通过与 Team Finance 整合,Casper Network 让 Token 的创建、部署更加高效

随着 Team Finance 整合到 Casper 系统中&#xff0c;Token 创建的过程变得更加迅速而简便。Casper Network 的方案正在使代币的创建变得易于访问与调整&#xff0c;这将让任何有创意和业务理念的人能够以高效、可信的方式&#xff0c;更快速、安全地在 Casper 上推出他们的项目…...

Linux软件管理rpm和yum

rpm方式管理 rpm软件包名称: 软件名称 版本号(主版本、次版本、修订号) 操作系统 -----90%的规律 #有依赖关系,不能自动解决依赖关系。 举例&#xff1a;openssh-6.6.1p1-31.el7.x86_64.rpm 数字前面的是名称 数字是版本号&#xff1a;第一位主版本号&#xff0c;第二位次版本…...

uart和usart的区别

UART 通用异步收发器&#xff0c;一般来说&#xff0c;在单片机上&#xff0c;名为UART的接口只能用于异步串行通信。 USART 名为USART的接口既可用于同步串行通信&#xff0c;也可用于异步串行通信。...

原生微信小程序-使用 阿里字体图标 详解

步骤一 1、打开阿里巴巴矢量图标库 网址&#xff1a;iconfont-阿里巴巴矢量图标库 2、搜索字体图标&#xff0c;鼠标悬浮点击添加入库 3、按如下步骤添加到自己的项目 步骤二 进入微信开发者工具 1、创建 fonts文件夹 > iconfont.wxss 文件&#xff0c;将刚才的代码复制…...

机器学习 | 机器学习基础知识

一、机器学习是什么 计算机从数据中学习规律并改善自身进行预测的过程。 二、数据集 1、最常用的公开数据集 2、结构化数据与非结构化数据 三、任务地图 1、分类任务 Classification 已知样本特征判断样本类别二分类、多分类、多标签分类 二分类&#xff1a;垃圾邮件分类、图像…...

OpenHarmony鸿蒙原生应用开发,ArkTS、ArkUI学习踩坑学习笔记,持续更新中。

一、AMD处理器win10系统下&#xff0c;DevEco Studio模拟器启动失败解决办法。 结论&#xff1a;在BIOS里面将Hyper-V打开&#xff0c;DevEco Studio模拟器可以成功启动。 二、ArkTS自定义组件导出、引用实现。 如果在另外的文件中引用组件&#xff0c;需要使用export关键字导…...

RHCE8 资料整理(十)二

RHCE8 资料整理 第 31 章 变量的使用&#xff08;一&#xff09;31.1 手动定义变量31.2 变量文件31.3 字典变量31.4 列表变量31.5 数字变量的运算31.6 注册变量31.7 facts变量 第 31 章 变量的使用&#xff08;一&#xff09; 31.1 手动定义变量 通过vars来定义变量&#xff…...

CUDA 学习记录2

1.是否启用一级缓存有什么影响&#xff1a; 启用一级缓存&#xff08;缓存加载操作经过一级缓存&#xff09;&#xff1a;一次内存十五操作以128字节的粒度进行。 不启用一级缓存&#xff08;没有缓存的加载不经过一级缓存&#xff09;&#xff1a;在内存段的粒度上&#xff…...

探索Qt 6.3:了解基本知识点和新特性

学习目标&#xff1a; 理解Qt6.3的基本概念和框架&#xff1a;解释Qt是什么&#xff0c;它的核心思想和设计原则。学会安装和配置Qt6.3开发环境&#xff1a;提供详细的步骤&#xff0c;让读者能够顺利安装和配置Qt6.3的开发环境。掌握Qt6.3的基本编程技巧&#xff1a;介绍Qt6.…...

持续集成交付CICD:基于 GitLabCI 与 JenkinsCD 实现后端项目发布

目录 一、实验 1. GitLabCI环境设置 2.优化GitLabCI共享库代码 3.JenkinsCD 发布后端项目 4.再次优化GitLabCI共享库代码 5.JenkinsCD 再次发布后端项目 一、实验 1. GitLabCI环境设置 &#xff08;1&#xff09;GitLab给后端项目添加CI配置路径 &#xff08;2&#xf…...

一些好用的VSCode扩展

可以在扩展这里直接搜索需要的扩展&#xff0c;点击安装即可。 1.Chinese 中文扩展&#xff0c;就是说虽然咱们懂点英语&#xff0c;但还是中文看着方便 2.Auto Rename Tag 当你重命名一个HTML 标签时&#xff0c;会自动重命名与他配对的HTML 标签 当你选择h4这个标签时&…...

3dsmax渲染太慢,用云渲染农场多少钱?

对于许多从事计算机图形设计的创作者来说&#xff0c;渲染速度慢是一个常见问题&#xff0c;尤其是对于那些追求极致出图效果的室内设计师和建筑可视化师&#xff0c;他们通常使用3ds Max这样的工具&#xff0c;而高质量的渲染经常意味着长时间的等待。场景复杂、细节丰富&…...

JVM-9-Class类文件的结构

Java技术能够一直保持着非常良好的向后兼容性&#xff0c;Class文件结构的稳定功不可没。 Class文件是一组以8个字节为基础单位的二进制流&#xff0c;各个数据项目严格按照顺序紧凑地排列在文件之中。 Class文件格式采用一种类似于C语言结构体的伪结构来存储数据&#xff0c…...

Redis持久化,性能管理

Redis高可用主要通过以下几种方式来实现&#xff1a;单机、主从复制、哨兵模式、和集群模式。这些方式都旨在提高系统的稳定性和可用性&#xff0c;特别是在面对服务器故障或其他问题时。 持久化&#xff1a; 在数据库和缓存系统中&#xff0c;持久化是指将数据保存在存储介质&…...

linux(centos7)离线安装mysql-5.7.35-1.el7.x86_64.rpm-bundle.tar

1. 卸载mariadb相关rpm # 查找 rpm -qa|grep mariadb rpm -qa|grep mysql# 卸载 rpm -e --nodeps mariadb... rpm -e --nodeps mysql...2. 删除mysql相关文件 # 查找 find / -name mysql# 删除 rm -rf /var/lib/mysql...3. 查看是否有相关依赖&#xff0c;没有需安装 rpm -q…...

【lesson17】MySQL表的基本操作--表去重、聚合函数和group by

文章目录 MySQL表的基本操作介绍插入结果查询&#xff08;表去重&#xff09;建表插入数据操作 聚合函数建表插入数据操作 group by&#xff08;分组&#xff09;建表插入数据操作 MySQL表的基本操作介绍 CRUD : Create(创建), Retrieve(读取)&#xff0c;Update(更新)&#x…...

面试题总结(十二)【Qt】【华清远见西安中心】

Qt是什么&#xff1f; Qt是一个跨平台的应用程序开发框架&#xff0c;最初由挪威的Trolltech公司开发。它提供了一套丰富的工具和类库&#xff0c;用于开发图形用户界面&#xff08;GUI&#xff09;应用程序、网络应用程序和嵌入式应用程序等。 Qt框架基于C语言编写&#xff0c…...

GPT-4V with Emotion:A Zero-shot Benchmark forMultimodal Emotion Understanding

GPT-4V with Emotion:A Zero-shot Benchmark forMultimodal Emotion Understanding GPT-4V情感:多模态情感理解的zero-shot基准 1.摘要 最近&#xff0c;GPT-4视觉系统(GPT-4V)在各种多模态任务中表现出非凡的性能。然而&#xff0c;它在情感识别方面的功效仍然是个问题。本文定…...

CogVLM与CogAgent:开源视觉语言模型的新里程碑

引言 随着机器学习的快速发展&#xff0c;视觉语言模型&#xff08;VLM&#xff09;的研究取得了显著的进步。今天&#xff0c;我们很高兴介绍两款强大的开源视觉语言模型&#xff1a;CogVLM和CogAgent。这两款模型在图像理解和多轮对话等领域表现出色&#xff0c;为人工智能的…...

CSS的盒子模型(重点)

网页布局的三大核心&#xff1a;盒子模型、浮动、定位 网页布局的过程&#xff1a; 1. 先准备好相关的网页元素&#xff0c;网页元素基本都是盒子 Box 。 2. 利用 CSS 设置好盒子样式&#xff0c;然后摆放到相应位置。 3. 往盒子里面装内容.网页布局的核心本质&#xff1a; 就…...