lua快速入门~在js基础上,知道Lua 和 Js 的不同即可
☺ lua 和 javaScript 差不多的,就是一些语法的细节不同,学过js,再注意一下下面的细节,就能上手了~
快速入门,可以直接看一下菜鸟教程的lua:https://www.runoob.com/lua/lua-tutorial.html
Lua 和 Js 的不同
Lua 概述
Lua概述
- Lua是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
Lua特性
1.轻量级
- 使用标准C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程序里。
2.可扩展
- Lua提供了非常易于使用的扩展接口和机制:由宿主语言(通常是C或C++)提供这些功能,Lua可以使用它们,就像是本来就内置的功能一样。
3.其它特性
支持面向过程(procedure-oriented)编程和函数式编程(functional programming)
自动内存管理;只提供了一种通用类型的表(table),用它可以实现数组,哈希表,集合,对象、字典,并且table是变长变量
语言内置模式匹配;闭包(closure);函数也可以看做一个值;提供多线程(协同进程,并非操作系统所支持的线程)支持
通过闭包和table可以很方便地支持面向对象编程所需要的一些关键机制,比如数据抽象,虚函数,继承和重载等
1、注释
(1) 单行注释:
--
(2) 多行注释:
--[[多行注释多行注释--]]
2、变量
全局变量:
- 默认情况下,没有被local 修饰的变量都是全局变量,不管它的位置在哪里
- 访问一个没有初始化的全局变量也不会出错,只不过得到的结果是:nil
- 如果你想删除一个全局变量,只需要将变量赋值为nil。
局部变量[私有]
- local 修饰
nil (空)
字符串
-
字符串由一对双引号或单引号来表示
-
也可以用 2 个方括号 “[[]]” 来表示"一块"字符串
string1 = "this is string1"
string2 = 'this is string2'html = [[
<html>
<head></head>
<body><a href="http://www.runoob.com/">菜鸟教程</a>
</body>
</html>
]]
print(html)
☺ 字符串拼接,使用的是 …
-- 举例子:
> print("a" .. 'b')
ab
> print(157 .. 428)
157428
加号 + ,这和java有区别,会把字符串转成数学的加分运算
-- 举例子:
> print("2" + 6)
8.0
> print("2" + "6")
8.0
计算字符串长度,使用#
> len = "www.runoob.com"
> print(#len)
3、循环语句、判断语句
循环语句
(1) while
while(condition)
dostatements
end
(2) for
var 从 exp1 变化到 exp2,每次变化以 exp3 为步长递增 var,并执行一次 “执行体”。exp3 是可选的,如果不指定,默认为1。
for var=exp1,exp2,exp3 do <执行体>
end -- 举例子:
tab1 = { key1 = "val1", key2 = "val2", "val3" }
for k, v in pairs(tab1) doprint(k .. " - " .. v)
end
(3) repeate
repeatstatements
until( condition )
判断语句
--[ 0 为 true ]
if(0)
thenprint("0 为 true")
end
4、函数获取可变参数的长度,也是使用#变量,或者使用select方法
-- 举例子:
function average(...)result = 0local arg={...} --> arg 为一个表,局部变量for i,v in ipairs(arg) doresult = result + vendprint("总共传入 " .. #arg .. " 个数")return result/#arg
endprint("平均值为",average(10,5,3,4,5,6))-----------------------------------
function average(...)result = 0local arg={...}for i,v in ipairs(arg) doresult = result + vendprint("总共传入 " .. select("#",...) .. " 个数")return result/select("#",...)
endprint("平均值为",average(10,5,3,4,5,6))
5、select 方法
- select(‘#’, …) 返回可变参数的长度。
- select(n, …) 用于返回从起点 n 开始到结束位置的所有参数列表
- 如果这时候使用一个变量指向方法 select(n, …),它只会得到第 n 位置的参数值
function f(...)a = select(3,...) -->从第三个位置开始,变量 a 对应右边变量列表的第一个参数print (a)print (select(3,...)) -->打印所有列表参数
endf(0,1,2,3,4,5)
-- 结果:
2
2 3 4 5
6、lua 的运算符
-
通用的加减乘除外,还有整除 // , 比如:5//2 输出结果 2
-
不等于 ~=
-
逻辑运算符:and、or、not
-
其他运算符:
… 连接两个字符串
# 一元运算符,返回字符串或表的长度
7、转义字符
所有的转义字符和所对应的意义:
| 转义字符 | 意义 | ASCII码值(十进制) |
|---|---|---|
| \a | 响铃(BEL) | 007 |
| \b | 退格(BS) ,将当前位置移到前一列 | 008 |
| \f | 换页(FF),将当前位置移到下页开头 | 012 |
| \n | 换行(LF) ,将当前位置移到下一行开头 | 010 |
| \r | 回车(CR) ,将当前位置移到本行开头 | 013 |
| \t | 水平制表(HT) (跳到下一个TAB位置) | 009 |
| \v | 垂直制表(VT) | 011 |
| \ | 代表一个反斜线字符’‘’ | 092 |
| ’ | 代表一个单引号(撇号)字符 | 039 |
| " | 代表一个双引号字符 | 034 |
| \0 | 空字符(NULL) | 000 |
| \ddd | 1到3位八进制数所代表的任意字符 | 三位八进制 |
| \xhh | 1到2位十六进制所代表的任意字符 | 二位十六进制 |
8、常用的字符串函数
Lua 提供了很多的方法来支持字符串的操作:
| 序号 | 方法 & 用途 |
|---|---|
| 1 | string.upper(argument): 字符串全部转为大写字母。 |
| 2 | string.lower(argument): 字符串全部转为小写字母。 |
| 3 | **string.gsub(mainString,findString,replaceString,num)**在字符串中替换。mainString 为要操作的字符串, findString 为被替换的字符,replaceString 要替换的字符,num 替换次数(可以忽略,则全部替换),如:> string.gsub("aaaa","a","z",3); zzza 3 |
| 4 | string.find (str, substr, [init, [plain]]) 在一个指定的目标字符串 str 中搜索指定的内容 substr,如果找到了一个匹配的子串,就会返回这个子串的起始索引和结束索引,不存在则返回 nil。init 指定了搜索的起始位置,默认为 1,可以一个负数,表示从后往前数的字符个数。plain 表示是否使用简单模式,默认为 false,true 只做简单的查找子串的操作,false 表示使用使用正则模式匹配。以下实例查找字符串 “Lua” 的起始索引和结束索引位置:> string.find("Hello Lua user", "Lua", 1) 7 9 |
| 5 | string.reverse(arg) 字符串反转> string.reverse("Lua") auL |
| 6 | string.format(…) 返回一个类似printf的格式化字符串> string.format("the value is:%d",4) the value is:4 |
| 7 | string.char(arg) 和 string.byte(arg[,int]) char 将整型数字转成字符并连接, byte 转换字符为整数值(可以指定某个字符,默认第一个字符)。> string.char(97,98,99,100) abcd > string.byte("ABCD",4) 68 > string.byte("ABCD") 65 > |
| 8 | string.len(arg) 计算字符串长度。string.len("abc") 3 |
| 9 | string.rep(string, n) 返回字符串string的n个拷贝> string.rep("abcd",2) abcdabcd |
| 10 | … 链接两个字符串> print("www.runoob.".."com") www.runoob.com |
| 11 | string.gmatch(str, pattern) 返回一个迭代器函数,每一次调用这个函数,返回一个在字符串 str 找到的下一个符合 pattern 描述的子串。如果参数 pattern 描述的字符串没有找到,迭代函数返回nil。> for word in string.gmatch("Hello Lua user", "%a+") do print(word) end Hello Lua user |
| 12 | string.match(str, pattern, init) string.match()只寻找源字串str中的第一个配对. 参数init可选, 指定搜寻过程的起点, 默认为1。 在成功配对时, 函数将返回配对表达式中的所有捕获结果; 如果没有设置捕获标记, 则返回整个配对字符串. 当没有成功的配对时, 返回nil。> = string.match("I have 2 questions for you.", "%d+ %a+") 2 questions > = string.format("%d, %q", string.match("I have 2 questions for you.", "(%d+) (%a+)")) 2, "questions" |
字符串替换
**string.gsub(mainString,findString,replaceString,num)**在字符串中替换。
- mainString 为要操作的字符串, findString 为被替换的字符,replaceString 要替换的字符,num 替换次数(可以忽略,则全部替换)
string.gsub("aaaa","a","z",3)
- 结果:zzza 3
字符串反转
string.reverse(arg) 字符串反转
string.reverse("Lua")
> auL
字符串长度
string.len(arg)
字符串拷贝
string.rep(string, n)
返回字符串string的n个拷贝
> string.rep("abcd",2)
abcdabcd
字符串拼接,使用的是 …
> print("www.runoob.".."com")
www.runoob.com
字符串截取
string.sub(s, i [, j]) 用于截取字符串,原型为:
参数说明:
- s:要截取的字符串。
- i:截取开始位置。
- j:截取结束位置,默认为 -1,最后一个字符。
print(string.sub("abcdef", 1, 3))
> abc
字符串查找
(1) string.find (str, substr, [init, [plain]])
在一个指定的目标字符串 str 中搜索指定的内容 substr,如果找到了一个匹配的子串,就会返回这个子串的起始索引和结束索引,不存在则返回 nil。
init 指定了搜索的起始位置,默认为 1,可以一个负数,表示从后往前数的字符个数。
plain 表示是否使用简单模式,默认为 false,true 只做简单的查找子串的操作,false 表示使用使用正则模式匹配。
以下实例查找字符串 “Lua” 的起始索引和结束索引位置:
> string.find("Hello Lua user", "Lua", 1)
7 9
(2) string.gmatch(str, pattern)
返回一个迭代器函数,每一次调用这个函数,返回一个在字符串 str 找到的下一个符合 pattern 描述的子串。如果参数 pattern 描述的字符串没有找到,迭代函数返回nil。
> for word in string.gmatch("Hello Lua user", "%a+") do print(word) end
Hello
Lua
user
(3) string.match(str, pattern, init)
string.match()只寻找源字串str中的第一个配对. 参数init可选, 指定搜寻过程的起点, 默认为1。
在成功配对时, 函数将返回配对表达式中的所有捕获结果; 如果没有设置捕获标记, 则返回整个配对字符串. 当没有成功的配对时, 返回nil。
> = string.match("I have 2 questions for you.", "%d+ %a+")
2 questions
区别:使用format 格式化一下
> = string.format("%d, %q", string.match("I have 2 questions for you.", "(%d+) (%a+)"))
2, "questions"
9、正则匹配规则
和java 不一样,可以到时候,使用lua 正则在线规则,检查是否正确
字符 含义
%a 字母a-z,A-Z
%b %bxy,以x和y进行成对匹配
%c 控制字符ASCII码 十进制转义表示为\0 - \31
%d 数字 0 - 9
%f %f[char-set],边界匹配,前一个不在范围内,后一个在
%g 除了空格以外的可打印字符 十进制转义表示为\33 - \126
%l 小写字母 a - z
%u 大写字母 A - Z
%s 空格 十进制转义表示为\32
%p 标点符号,即!@#$%^&*()`~-_=+{}:"<>?[];',./| 32个字符
%w 字母数字 a - z, A - Z, 0 - 9
%x 十六进制符号 0 - 9, a - f, A - F
模糊匹配的其他匹配情况[单个字符(除 ^$()%.[]*±? 外): 与该字符自身配对]:https://www.runoob.com/lua/lua-strings.html
10、字符串格式化
Lua 提供了 string.format() 函数,以下是它的一些转义码:
%c - 接受一个数字, 并将其转化为ASCII码表中对应的字符
%d, %i - 接受一个数字并将其转化为有符号的整数格式
%o - 接受一个数字并将其转化为八进制数格式
%u - 接受一个数字并将其转化为无符号整数格式
%x - 接受一个数字并将其转化为十六进制数格式, 使用小写字母
%X - 接受一个数字并将其转化为十六进制数格式, 使用大写字母
%e - 接受一个数字并将其转化为科学记数法格式, 使用小写字母e
%E - 接受一个数字并将其转化为科学记数法格式, 使用大写字母E
%f - 接受一个数字并将其转化为浮点数格式
%g(%G) - 接受一个数字并将其转化为%e(%E, 对应%G)及%f中较短的一种格式
%q - 接受一个字符串并将其转化为可安全被Lua编译器读入的格式
%s - 接受一个字符串并按照给定的参数格式化该字符串
11、字符与整数相互转换
string.byte(字符串) 转换第一个字符
string.char(数字) 转换为字符
12、Lua特性:自动内存管理;只提供了一种通用类型的表(table),用它可以实现数组,哈希表,集合,对象、字典,并且table是变长变量
table 变量注意事项:
table 的索引不可以是数字,也不可以是字符串,会报错,只能是普通变量。
> tbl ={100 = "100"}
stdin:1: '}' expected near '='
> tbl ={"100" = "100"}
stdin:1: '}' expected near '='-- 正确写法:
> tbl = {a = "aa"}
> print(tbl["a"])
aa
> print(tbl.a)
aa
(1) 数组
array = {}for i= -2, 2 doarray[i] = i *2
endfor i = -2,2 doprint(array[i])
end
-
结果:
-4
-2
0
2
4
(2) Lua 迭代器
☺ 泛型迭代
pairs 和 ipairs异同
同:都能进行for 循环遍历
异:ipairs 仅仅遍历值,按照索引升序遍历,索引中断停止遍历。即不能返回 nil,只能返回数字 0,如果遇到 nil 则退出。所以table 变量中的变量是键值对形式的,它会直接忽略,即ipairs 迭代时会略过非数值的索引。
pairs 能遍历集合的所有元素。即 pairs 可以遍历集合中所有的 key,并且除了迭代器本身以及遍历表本身还可以返回 nil。
注意:下面两个例子的结果的顺序、特点
tab = {"Hello","World",a=1,b=2,z=3,x=10,y=20,"Good","Bye"}
for k,v in pairs(tab) doprint(k.." "..v)
end
- 结果:
1 Hello
2 World
3 Good
4 Bye
a 1
x 10
b 2
y 20
z 3
tab = {"Hello","World",a=1,b=2,z=3,x=10,y=20,"Good","Bye"}
for k,v in ipairs(tab) doprint(k.." "..v)
end
- 结果:
1 Hello
2 World
3 Good
4 Bye
如上代码输出结果存在一定规律,“Hello”、“World”、“Good”、"Bye"是表中的值,在存储时是按照顺序存储的,并且不同于其他脚本语言,Lua是从1开始排序的,因此,使用pairs遍历打印输出时,会先按照顺序输出表的值,然后再按照键值对的键的哈希值打印。
☺ 泛型迭代的例子2:
for k, v in pairs(t) doprint(k, v)
end-------------------------------------------
array = {"Google", "Runoob"}for key,value in ipairs(array)
doprint(key, value)
end
- 结果:
1 Google
2 Runoob
☺ 泛型 for 在迭代的时候每次调用的是闭包函数,迭代函数只是开始的时候调用一次
function eleiter(t)local index = 0print('in eleiter function') --> 每次调用迭代函数都说一句:in eleiter functionreturn function()print('I am here.') --> 每次调用闭包函数都说一句:I am hereindex = index + 1return t[index]end
endt = {'one','two','three','four','five'}
for ele in eleiter(t) doprint(ele)
end
- 结果:
in eleiter function --> 【
for 迭代函数内部包含闭包函数的情况,对于函数非闭包内容,只执行一次】–>
泛型 for 在迭代的时候每次调用的是闭包函数I am here.
one
I am here.
two
I am here.
three
I am here.
four
I am here.
five
I am here.
(2) 表、字典、对象…
在lua使用 table 表示了数组、表、字典、对象table 特点:
Lua table 使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能是 nil。
Lua table 是不固定大小的,你可以根据自己需要进行扩容。
Lua 的table 变量是引用型变量,即地址指向。
tab = {"Hello","World",a=1,b=2,z=3,x=10,y=20,"Good","Bye"}
tab[1] = "W两个世界"
for k,v in ipairs(tab) doprint(k.." "..v)
end
- 结果:
1 W两个世界
2 World
3 Good
4 Bye
Lua 的table 变量是引用型变量,即地址指向。
-- 简单的 table
mytable = {}
print("mytable 的类型是 ",type(mytable))mytable[1]= "Lua"
mytable["wow"] = "修改前"
print("mytable 索引为 1 的元素是 ", mytable[1])
print("mytable 索引为 wow 的元素是 ", mytable["wow"])-- alternatetable和mytable的是指同一个 table
alternatetable = mytableprint("alternatetable 索引为 1 的元素是 ", alternatetable[1])
print("mytable 索引为 wow 的元素是 ", alternatetable["wow"])alternatetable["wow"] = "修改后"print("mytable 索引为 wow 的元素是 ", mytable["wow"])-- 释放变量
alternatetable = nil
print("alternatetable 是 ", alternatetable)-- mytable 仍然可以访问
print("mytable 索引为 wow 的元素是 ", mytable["wow"])mytable = nil
print("mytable 是 ", mytable)
- 结果:
mytable 的类型是 table
mytable 索引为 1 的元素是 Lua
mytable 索引为 wow 的元素是 修改前
alternatetable 索引为 1 的元素是 Lua
mytable 索引为 wow 的元素是 修改前
mytable 索引为 wow 的元素是 修改后
alternatetable 是 nil
mytable 索引为 wow 的元素是 修改后
mytable 是 nil
(3) table 的增删改查操作
| 序号 | 方法 & 用途 |
|---|---|
| 1 | **table.concat (table [, sep [, start [, end]]])😗*concat是concatenate(连锁, 连接)的缩写. table.concat()函数列出参数中指定table的数组部分从start位置到end位置的所有元素, 元素间以指定的分隔符(sep)隔开。 |
| 2 | **table.insert (table, [pos,] value)😗*在table的数组部分指定位置(pos)插入值为value的一个元素. pos参数可选, 默认为数组部分末尾. |
| 3 | **table.maxn (table)**指定table中所有正数key值中最大的key值. 如果不存在key值为正数的元素, 则返回0。(Lua5.2之后该方法已经不存在了,本文使用了自定义函数实现) |
| 4 | **table.remove (table [, pos])**返回table数组部分位于pos位置的元素. 其后的元素会被前移. pos参数可选, 默认为table长度, 即从最后一个元素删起。 |
| 5 | **table.sort (table [, comp])**对给定的table进行升序排序。 |
13、协同程序 coroutine
(1) 基本语法
| 方法 | 描述 |
|---|---|
| coroutine.create() | 创建 coroutine,返回 coroutine, 参数是一个函数,当和 resume 配合使用的时候就唤醒函数调用 |
| coroutine.resume() | 重启 coroutine,和 create 配合使用 |
| coroutine.yield() | 挂起 coroutine,将 coroutine 设置为挂起状态,这个和 resume 配合使用能有很多有用的效果 |
| coroutine.status() | 查看 coroutine 的状态 注:coroutine 的状态有三种:dead,suspended,running,具体什么时候有这样的状态请参考下面的程序 |
| coroutine.wrap() | 创建 coroutine,返回一个函数,一旦你调用这个函数,就进入 coroutine,和 create 功能重复 |
| coroutine.running() | 返回正在跑的 coroutine,一个 coroutine 就是一个线程,当使用running的时候,就是返回一个 coroutine 的线程号 |
当create一个coroutine的时候就是在新线程中注册了一个事件。
当使用resume触发事件的时候,create的coroutine函数就被执行了,当遇到yield的时候就代表挂起当前线程,等候再次resume触发事件。
可以把 yield 当成暂时,点击resume 当成开始,并且具有“断点续传” 作用
-- 注册一个事件
co = coroutine.create(function(i)print(coroutine.status(co)) -- 挂起/暂停coroutine.yield()print(i);end
)-- 执行事件
coroutine.resume(co, 1)
print(coroutine.status(co))
coroutine.resume(co, 3) -- 重新开始,相当于“断点续传”,因为这时候传递参数已经是3,但在原先情况上继续执行,会执行coroutine.resume(co, 1) 的参数1
- 结果:
running
suspended
1
(2) coroutine.creat方法和coroutine.wrap 的区别
- 返回值不同:coroutine.creat返回的是一个协同程序,类型为thread,需要使用coroutine.resume进行调用;而coroutine.wrap返回的是一个普通的方法(函数),类型为function,和普通function有同样的使用方法,并且不能使用coroutine.resume进行调用。
co_creat = coroutine.create(function()print("co_creat类型是"..type(co_creat))end
)co_wrap = coroutine.wrap(function()print("co_wrap类型是"..type(co_wrap))end
)coroutine.resume(co_creat)
co_wrap()
- 结果:
co_creat类型是thread
co_wrap类型是function
14、创建对象
Lua 中使用":"实现面向对象方式的调用。":"只是语法糖,它同时在方法的声明与实现中增加了一个名为 self 的隐藏参数,这个参数就是对象本身。
- --实例:
Account = {balance = 0};--生成对象
function Account:new(o)o = o or {}; --如果用户没有提供对象,则创建一个。setmetatable(o, self); --将 Account 作为新创建的对象元表self.__index = self; --将新对象元表的 __index 指向为 Account(这样新对象就可以通过索引来访问 Account 的值了)return o; --将新对象返回
end--存款
function Account:deposit(v)self.balance = self.balance + v;
end--取款
function Account:withdraw(v)self.balance = self.balance - v;
end--查询
function Account:demand()print(self.balance);
end--创建对象
myAccount = Account:new();
--通过索引访问
print(myAccount.balance);
--调用函数
myAccount:deposit(100);
myAccount:withdraw(50);
myAccount:demand();
-
结果:
0
50
如果本文对你有帮助的话记得给一乐点个赞哦,感谢!
相关文章:
lua快速入门~在js基础上,知道Lua 和 Js 的不同即可
☺ lua 和 javaScript 差不多的,就是一些语法的细节不同,学过js,再注意一下下面的细节,就能上手了~ 快速入门,可以直接看一下菜鸟教程的lua:https://www.runoob.com/lua/lua-tutorial.html Lua 和 Js 的不同…...
Linux系统【Centos7】更换源详细教程
更换CentOS 7系统的源可以提高网络速度,加快软件升级和安装的速度。以下是详细的更换CentOS 7源实践。 步骤 1:备份原始 Yum.repo 在更换之前,首先要备份原始 Yum.repo 文件(一定要记得备份)。 bash sudo mv /etc/y…...
金三银四求职季来了!分享几道最常见的app面试题,帮助您更好准备面试求职!
目录:导读 引言 一、Web 端测试和 App 端测试有何不同? 二、App是如何测试的? 三、app闪退的可能原因? 四、给你一个登录页面,你要如何测试? 五、测试过程中遇到app出现crash或者ANR,你会怎么处理? …...
Java集合——List接口学习总结
一、ArrayList实现类 1. 常用方法 增加:add(int index, E element)删除:remove(int index) remove(Object o)修改:set(int index, E element)查看:get(int index)判断:常用遍历方式://List集合 遍历&…...
低代码(三)低代码平台前端技术组件选型1.0(前端)
目前国内主流的低代码开发平台有:金蝶、用友、宜搭、云程、简道云、明道云、氚云、伙伴云、道一云、JEPaaS、华炎魔方、搭搭云、JeecgBoot 、RuoYi等。这些平台各有优劣势,定位也不同,用户可以根据自己需求选择。如果企业想自主可控ÿ…...
代码随想录算法训练营第35天|860.柠檬水找零,406.根据身高重建队列,452. 用最少数量的箭引爆气球
代码随想录算法训练营第35天|860.柠檬水找零,406.根据身高重建队列,452. 用最少数量的箭引爆气球860.柠檬水找零406. 根据身高重建队列452. 用最少数量的箭引爆气球860.柠檬水找零 题目链接:860.柠檬水找零,难度:简单…...
C++整人代码,十分朴实但威力无穷,让你对cout怀疑人生,整死你的同学
cout人人皆知 /a 只是让电脑响个铃 直接上个简单的代码 #include<iostream> using namespace std; int main() {while(1)cout<<"\a"; }最后普及一下: 控制符的作用有: setbase(n) 以n进制方式输出(n8,10,16) setfill(ch) 设置…...
【Spring Cloud Alibaba】12.定时任务(xxl-job)
文章目录简介什么是xxl-job调度中心执行器官方架构图相关地址环境要求配置调度中心下载源码目录说明初始化数据库源码方式docker方式测试集群(可选)配置执行器pom.xmlapplication.propertiesXxlJobExecutorApplication.java执行器组件配置创建定时任务任…...
GDB core dump分析
基本知识 Linux core dump:一般称之为核心转储、内核转储,我们统称为转储文件。是某个时刻某个进程的内存信息映射,即包含了生成转储文件时该进程的整个内存信息以及寄存器等信息。转储文件可以是某个进程的,也可以是整个系统的。…...
Leetcode.111 二叉树的最小深度
题目链接 Leetcode.111 二叉树的最小深度 easy 题目描述 给定一个二叉树,找出其最小深度。 最小深度是从 根节点 到 最近叶子节点 的 最短路径上的节点数量。 说明: 叶子节点是指没有子节点的节点。 示例 1: 输入:root [3,9,20,null,nul…...
【RP-RV1126】SDK编译常用记录
文章目录一、单独编译1.1 单独配置编译kernel1.2 单独编译配置Buildroot1.3 单独编译rkmedia1.3.1 添加自己的rkmedia代码文件荣品的RV1126。一、单独编译 如果执行 build.sh 运行完成后没有在 rockdev/ 目录下生成镜像文件,请执行: ./build.sh firmwa…...
【操作系统复习】第5章 存储器管理
存储器的层次结构 存储层次 ➢ CPU寄存器 ➢ 主存:高速缓存、主存储器、磁盘缓存 ➢ 辅存:固定磁盘、可移动介质 层次越高,访问速度越快,价格也越高,存储容量也最小 寄存器和主存掉电后存储的信息不再存在&a…...
Python人工智能在气象中的实践技术应用
专题一 Python 和科学计算基础 1.1 Python 入门和安装 1.1.1 Python 背景及其在气象中的应用 1.1.2 Anaconda 解释和安装以及 Jupyter 配置1.1.3 Python 基础语法 1.2 科学数据处理基础库 1.2.1 Numpy 库1.2.2 Pandas 库1.2.3 Scipy 库 1.2.4 Matplotlib 和 Cartopy 库 …...
libcurl库的安装及使用说明
目录 一 libcurl库安装 ① 下载网址 ② libcurl库安装步骤 ③ libcurl等第三方库的通用编译方法 二 调用libcurl编程访问百度主页 ① 代码说明 ② 编译说明 ③ 执行说明 三 libcurl的使用说明 ① curl相关函数简介 ② curl_easy_setopt函数部分选项介绍 ③…...
【JAVAEE】手把手教学多线程,包教包会~
线程与进程为了实现多个任务并发执行的效果,人们引进了进程。何谓进程?我们电脑上跑起来的每个程序都是进程。每一个进程启动,系统会为其分配内存空间以及在文件描述符表上有所记录等。进程是操作系统进行资源分配的最小单位,这意…...
基于ChatGPT API的PC端软件开发过程遇到的问题的分析
如果喜欢本文章,记得收藏哦! 关注我,一起学Java。 一、基于ChatGPT API的PC端软件开发过程遇到的问题的分析 最近这个OpenAI公司推出的GPT-4.0模型真是太火了。当然由于OpenAI目前还没有正式全面对外开放GPT-4.0 API,所以本次使用…...
啥是插入排序 ?
一、概述 排序是算法中的一部分。所以我们学习排序也是算法的入门,为了能让大家感受到排序是算法的一部分,我举个例子证明一下:比如麻将游戏,发完牌之后需要对手上的牌进行排序,大家想想,麻将排序如何排呢…...
华为OD机试题 Q2 押题【贪心的商人 or 最大利润】用 C++ 编码,速通
最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧本篇题解:贪心的商人 or 最大利润 题目…...
spring框架注解
3.Spring有哪些常用注解呢? Spring常用注解 Web: Controller:组合注解(组合了Component注解),应用在MVC层(控制层)。 RestController:该注解为一个组合注解,相当于Con…...
前端如何处理文本溢出
前言 在现代网页设计中,文本是网页中最重要的内容之一。然而,当文本超出其容器的大小时,会发生文本溢出的问题。文本溢出不仅会影响网页的视觉效果,还会影响网页的可读性和可用性。在前端开发中,解决文本溢出的问题是…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...
软件工程 期末复习
瀑布模型:计划 螺旋模型:风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合:模块内部功能紧密 模块之间依赖程度小 高内聚:指的是一个模块内部的功能应该紧密相关。换句话说,一个模块应当只实现单一的功能…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
DAY 26 函数专题1
函数定义与参数知识点回顾:1. 函数的定义2. 变量作用域:局部变量和全局变量3. 函数的参数类型:位置参数、默认参数、不定参数4. 传递参数的手段:关键词参数5 题目1:计算圆的面积 任务: 编写一…...
