lua学习
Posted qq_40707462
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lua学习相关的知识,希望对你有一定的参考价值。
notepad 编码方式 ansi
cmd:lua54.exe 文件全名.lua
一、数据结构
1、table
遍历
tab1 = key1 = "val1", key2 = "val2", "val3"
for k, v in pairs(tab1) do
print(k .. " - " .. v)
end
-- 给全局变量或者 table 表里的变量赋一个 nil 值,等同于把它们删掉
tab1.key1 = nil
for k, v in pairs(tab1) do
print(k .. " - " .. v)
end
结果
1 - val3
key1 - val1
key2 - val2
1 - val3
key2 - val2
新建表
-- 创建一个空的 table
local tbl1 =
-- 直接初始表
local tbl2 = "apple", "pear", "orange", "grape"
索引
Lua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字或者是字符串。
默认初始索引一般以 1 开始
a =
a["key"] = "value"
key = 10
a[key] = 22
a[key] = a[key] + 11
for k, v in pairs(a) do
print(k .. " : " .. v)
end
结果
key : value
10 : 33
一些操作
2、基本操作
nil比较要加双引号,type(X) 实质是返回的是一个 string 类型
type(X)==nil
false
type(X)=="nil"
true
#
来计算字符串的长度
> len = "www.runoob.com"
> print(#len)
14
字符连接 ..
> print("a" .. 'b')
ab
> print(157 .. 428)
157428
3、if-else,boolean
if false or nil then
print("至少有一个是 true")
else
print("false 和 nil 都为 false")
end
if 0 then
print("数字 0 是 true")
else
print("数字 0 为 false")
end
false 和 nil 都为 false
数字 0 是 true
4、number
print(type(2))
print(type(2.2))
print(type(0.2))
print(type(2e+1))
print(type(0.2e-1))
print(type(7.8263692594256e-06))
在对一个数字字符串上进行算术操作时,Lua 会尝试将这个数字字符串转成一个数字
> print("2" + 6)
8.0
> print("2" + "6")
8.0
> print("2 + 6")
2 + 6
> print("-2e2" * "6")
-1200.0
5、string
https://www.runoob.com/lua/lua-strings.html
用 " "
或者 [[ ]]
html = [[
<html>
<head></head>
<body>
<a href="http://www.runoob.com/">菜鸟教程</a>
</body>
</html>
]]
print(html)
6、函数
-- function_test.lua 脚本文件
function factorial1(n)
if n == 0 then
return 1
else
return n * factorial1(n - 1)
end
end
print(factorial1(5))
factorial2 = factorial1
print(factorial2(5))
$ lua function_test.lua
120
120
匿名函数
-- function_test2.lua 脚本文件
function testFun(tab,fun)
for k ,v in pairs(tab) do
print(fun(k,v));
end
end
tab=key1="val1",key2="val2";
testFun(tab,
function(key,val)--匿名函数
return key.."="..val;
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))
7、变量赋值
local 的作用域到语句块结束
do
local a = 6 -- 局部变量
b = 6 -- 对局部变量重新赋值
print(a,b); --> 6 6
end
print(a,b) --> 5 6
table索引
t[i]
t.i
a = "hello" .. "world"
t.n = t.n + 1
-- 交换,个数不同时,按变量个数补足nil,或多余的值会被忽略
x, y = y, x
a, b, c = 0
print(a,b,c) --> 0 nil nil
-- 函数多返回值
a, b = f()
二、循环
1、while 循环
在条件为 true 时,让程序重复地执行某些语句。执行语句前会先检查条件是否为 true。
a=10
while( a < 20 )
do
print("a 的值为:", a)
a = a+1
end
2、for 循环
重复执行指定语句,重复次数可在 for 语句中控制。
var 从 exp1 变化到 exp2,每次变化以 exp3 为步长递增 var,并执行一次 “执行体”。exp3 是可选的,如果不指定,默认为1。
for var=exp1,exp2,exp3 do
<执行体>
end
for的三个表达式在循环开始前一次性求值,以后不再进行求值。比如上面的f(x)只会在循环开始前执行一次,其结果用在后面的循环中。
function f(x)
print("function")
return x*2
end
for i=1,f(5) do print(i)
end
结果:function 只打印一次
function
1
2
3
4
5
6
7
8
9
10
循环数组
a = "one", "two", "three"
for i, v in ipairs(a) do
print(i, v)
end
3、repeat…until
重复执行循环,直到 指定的条件为真时为止
a = 10
repeat
print("a的值为:", a)
a = a + 1
until( a > 15 )
a的值为: 10
a的值为: 11
a的值为: 12
a的值为: 13
a的值为: 14
a的值为: 15
4、循环嵌套
可以在循环内嵌套一个或多个循环语句(while do … end;for … do … end;repeat … until;)
j =2
for i=2,10 do
for j=2,(i/j) , 2 do
if(not(i%j))
then
break
end
if(j > (i/j))then
print("i 的值为:",i)
end
end
end
i 的值为: 8
i 的值为: 9
i 的值为: 10
5、break
a = 10
--[ while 循环 --]
while( a < 20 )
do
print("a 的值为:", a)
a=a+1
if( a > 15)
then
break
end
end
6、goto、continue
i = 0
::s1:: do
print(i)
i = i+1
end
if i>3 then
os.exit() -- i 大于 3 时退出
end
goto s1
结果
0
1
2
3
continue
for i=1, 3 do
if i <= 2 then
print(i, "yes continue")
goto continue
end
print(i, " no continue")
::continue::
print([[i'm end]])
end
1 yes continue
i'm end
2 yes continue
i'm end
3 no continue
i'm end
7、无限循环
while( true )
do
print("循环将永远执行下去")
end
8、if-else
if( 布尔表达式 1)
then
--[ 在布尔表达式 1 为 true 时执行该语句块 --]
elseif( 布尔表达式 2)
then
--[ 在布尔表达式 2 为 true 时执行该语句块 --]
elseif( 布尔表达式 3)
then
--[ 在布尔表达式 3 为 true 时执行该语句块 --]
else
--[ 如果以上布尔表达式都不为 true 则执行该语句块 --]
end
三、面向对象
我们可以使用点号(.)来访问类的属性:
print(r.length)
我们可以使用冒号 : 来访问类的成员函数:
r:printArea()
-- 元类
Shape = area = 0
-- 基础类方法 new
function Shape:new (o,side)
o = o or
setmetatable(o, self)
self.__index = self
side = side or 0
self.area = side*side;
return o
end
-- 基础类方法 printArea
function Shape:printArea ()
print("面积为 ",self.area)
end
-- 创建对象
myshape = Shape:new(nil,10)
myshape:printArea()
继承
-- Meta class
Shape = area = 0
-- 基础类方法 new
function Shape:new (o,side)
o = o or
setmetatable(o, self)
self.__index = self
side = side or 0
self.area = side*side;
return o
end
-- 基础类方法 printArea
function Shape:printArea ()
print("面积为 ",self.area)
end
-- 创建对象
myshape = Shape:new(nil,10)
myshape:printArea()
Square = Shape:new()
-- 派生类方法 new
function Square:new (o,side)
o = o or Shape:new(o,side)
setmetatable(o, self)
self.__index = self
return o
end
-- 派生类方法 printArea
function Square:printArea ()
print("正方形面积为 ",self.area)
end
-- 创建对象
mysquare = Square:new(nil,10)
mysquare:printArea()
Rectangle = Shape:new()
-- 派生类方法 new
function Rectangle:new (o,length,breadth)
o = o or Shape:new(o)
setmetatable(o, self)
self.__index = self
self.area = length * breadth
return o
end
-- 派生类方法 printArea
function Rectangle:printArea ()
print("矩形面积为 ",self.area)
end
-- 创建对象
myrectangle = Rectangle:new(nil,10,20)
myrectangle:printArea()
面积为 100
正方形面积为 100
矩形面积为 200
以上是关于lua学习的主要内容,如果未能解决你的问题,请参考以下文章