- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
☺ lua 和 javaScript 差不多的,就是一些语法的细节不同,学过js,再注意一下下面的细节,就能上手了~ 。
快速入门,可以直接看一下菜鸟教程的lua: https://www.runoob.com/lua/lua-tutorial.html 。
1.轻量级 。
2.可扩展 。
3.其它特性 。
支持面向过程(procedure-oriented)编程和函数式编程(functional programming) 。
自动内存管理;只提供了一种通用类型的表(table),用它可以实现数组,哈希表,集合,对象、字典,并且table是变长变量 。
语言内置模式匹配;闭包(closure);函数也可以看做一个值;提供多线程(协同进程,并非操作系统所支持的线程)支持 。
通过闭包和table可以很方便地支持面向对象编程所需要的一些关键机制,比如数据抽象,虚函数,继承和重载等 。
--
--[[
多行注释
多行注释
--]]
私有
] 字符串由一对 双引号 或 单引号 来表示 。
也可以用 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)
while(condition)
do
statements
end
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) do
print(k .. " - " .. v)
end
repeat
statements
until( condition )
--[ 0 为 true ]
if(0)
then
print("0 为 true")
end
-- 举例子:
function average(...)
result = 0
local arg={...} --> arg 为一个表,局部变量
for i,v in ipairs(arg) do
result = result + v
end
print("总共传入 " .. #arg .. " 个数")
return result/#arg
end
print("平均值为",average(10,5,3,4,5,6))
-----------------------------------
function average(...)
result = 0
local arg={...}
for i,v in ipairs(arg) do
result = result + v
end
print("总共传入 " .. select("#",...) .. " 个数")
return result/select("#",...)
end
print("平均值为",average(10,5,3,4,5,6))
function f(...)
a = select(3,...) -->从第三个位置开始,变量 a 对应右边变量列表的第一个参数
print (a)
print (select(3,...)) -->打印所有列表参数
end
f(0,1,2,3,4,5)
-- 结果:
2
2 3 4 5
通用的加减乘除外,还有整除 // , 比如: 5//2 输出结果 2 。
不等于 ~= 。
逻辑运算符:and、or、not 。
其他运算符:
.. 连接两个字符串 。
# 一元运算符,返回字符串或表的 长度 。
所有的转义字符和所对应的意义:
转义字符 | 意义 | 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位十六进制所代表的任意字符 | 二位十六进制 |
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) 在字符串中替换.
string.gsub("aaaa","a","z",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]) 用于截取字符串,原型为:
参数说明:
print(string.sub("abcdef", 1, 3))
> abc
在一个指定的目标字符串 str 中搜索指定的内容 substr,如果找到了一个匹配的子串,就会返回这个子串的起始索引和结束索引,不存在则返回 nil.
init 指定了搜索的起始位置,默认为 1,可以一个负数,表示从后往前数的字符个数.
plain 表示是否使用简单模式,默认为 false,true 只做简单的查找子串的操作,false 表示使用使用正则模式匹配.
以下实例查找字符串 "Lua" 的起始索引和结束索引位置:
> string.find("Hello Lua user", "Lua", 1)
7 9
返回一个迭代器函数,每一次调用这个函数,返回一个在字符串 str 找到的下一个符合 pattern 描述的子串。如果参数 pattern 描述的字符串没有找到,迭代函数返回nil.
> for word in string.gmatch("Hello Lua user", "%a+") do print(word) end
Hello
Lua
user
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"
和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 。
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 - 接受一个字符串并按照给定的参数格式化该字符串
string.byte(字符串) 转换第一个字符 。
string.char(数字) 转换为字符 。
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
array = {}
for i= -2, 2 do
array[i] = i *2
end
for i = -2,2 do
print(array[i])
end
结果:
-4 -2 0 2 4 。
同:都能进行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) do
print(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) do
print(k.." "..v)
end
1 Hello 2 World 3 Good 4 Bye 。
如上代码输出结果存在一定规律,"Hello"、"World"、"Good"、"Bye"是表中的值,在存储时是按照顺序存储的,并且不同于其他脚本语言,Lua是从1开始排序的,因此,使用pairs遍历打印输出时,会先按照顺序输出表的值,然后再按照键值对的键的哈希值打印.
for k, v in pairs(t) do
print(k, v)
end
-------------------------------------------
array = {"Google", "Runoob"}
for key,value in ipairs(array)
do
print(key, value)
end
1 Google 2 Runoob 。
function eleiter(t)
local index = 0
print('in eleiter function') --> 每次调用迭代函数都说一句:in eleiter function
return function()
print('I am here.') --> 每次调用闭包函数都说一句:I am here
index = index + 1
return t[index]
end
end
t = {'one','two','three','four','five'}
for ele in eleiter(t) do
print(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. 。
在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) do
print(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 = mytable
print("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 。
序号 | 方法 & 用途 |
---|---|
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进行升序排序。 |
方法 | 描述 |
---|---|
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 。
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 。
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快速入门~在js基础上,知道Lua和Js的不同即可的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有 table 像这样 -------------------------------------------- id size title priority
我的应用在不同的 Activity (4 个 Activity )中仅包含横幅广告。所以我的疑问是, 我可以对所有横幅广告使用一个广告单元 ID 吗? 或者 每个 Activity 使用不同的广告单元
我有任意(但统一)数字列表的任意列表。 (它们是 n 空间中 bin 的边界坐标,我想绘制其角,但这并不重要。)我想生成所有可能组合的列表。所以:[[1,2], [3,4],[5,6]] 产生 [[1
我刚刚在学校开始学习 Java,正在尝试自定义控件和图形。我目前正在研究图案锁,一开始一切都很好,但突然间它绘制不正确。我确实更改了一些代码,但是当我看到错误时,我立即将其更改回来(撤消,ftw),但
在获取 Distinct 的 Count 时,我在使用 Group By With Rollup 时遇到了一个小问题。 问题是 Rollup 摘要只是所有分组中 Distinct 值的总数,而不是所有
这不起作用: select count(distinct colA, colB) from mytable 我知道我可以通过双选来简单地解决这个问题。 select count(*) from (
这个问题在这里已经有了答案: JavaScript regex whitespace characters (5 个回答) 2年前关闭。 你能解释一下为什么我会得到 false比较 text ===
这个问题已经有答案了: 奥 git _a (56 个回答) 已关闭 9 年前。 我被要求用 Javascript 编写一个函数 sortByFoo 来正确响应此测试: // Does not cras
所以,我不得不说,SQL 是迄今为止我作为开发人员最薄弱的一面。也许我想要完成的事情很简单。我有这样的东西(这不是真正的模型,但为了使其易于理解而不浪费太多时间解释它,我想出了一个完全模仿我必须使用的
这个问题在这里已经有了答案: How does the "this" keyword work? (22 个回答) 3年前关闭。 简而言之:为什么在使用 Objects 时,直接调用的函数和通过引用传
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicate: what is the difference between (.) dot operator and (-
我真的不明白这里发生了什么但是: 当我这样做时: colorIndex += len - stopPos; for(int m = 0; m < len - stopPos; m++) { c
思考 MySQL 中的 Group By 函数的最佳方式是什么? 我正在编写一个 MySQL 查询,通过 ODBC 连接在 Excel 的数据透视表中提取数据,以便用户可以轻松访问数据。 例如,我有:
我想要的SQL是这样的: SELECT week_no, type, SELECT count(distinct user_id) FROM group WHERE pts > 0 FROM bas
商店表: +--+-------+--------+ |id|name |date | +--+-------+--------+ |1 |x |Ma
对于 chrome 和 ff,当涉及到可怕的 ie 时,这个脚本工作完美。有问题 function getY(oElement) { var curtop = 0; if (oElem
我现在无法提供代码,因为我目前正在脑海中研究这个想法并在互联网上四处乱逛。 我了解了进程间通信和使用共享内存在进程之间共享数据(特别是结构)。 但是,在对保存在不同 .c 文件中的程序使用 fork(
我想在用户集合中使用不同的功能。在 mongo shell 中,我可以像下面这样使用: db.users.distinct("name"); 其中名称是用于区分的集合字段。 同样我想要,在 C
List nastava_izvjestaj = new List(); var data_context = new DataEvidencijaDataContext();
我的 Rails 应用程序中有 Ransack 搜索和 Foundation,本地 css 渲染正常,而生产中的同一个应用程序有一个怪癖: 应用程序中的其他内容完全相同。 我在 Chrome 和 Sa
我是一名优秀的程序员,十分优秀!