Mrli
别装作很努力,
因为结局不会陪你演戏。
Contacts:
QQ博客园

lua学习

2019/09/15 lua
Word count: 868 | Reading time: 4min

lua学习

动态脚本语言,可嵌入C和C++,Lua负责逻辑,C、C++负责功能

C编译,跨平台性良好

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
-- 循环结构 [1,10]
for i=1,10 do
print(i)
end

-- 函数
function function_name( ... )
-- body
end

-- 选择结构
if

else

end

{} <==>字典

1
2
3
4
5
6
7
8
9
10
Conftg={ hello="Hello Lua", world="World"}
Config.words="Hello"
Config.num=180
Config["name"]="ZhangSan"
print(Config["words"])
print(Config. name)
print(Config, hello)
for key, var in pairs(Config) do
print(key, var)
end

数组{}

1
2
3
4
5
6
7
8
9
10
arr = {1,2,3,'hello'}
for k,v in pairs(arr) do
print(k,v)
end

>>>
1 1
2 2
3 3
4 hello

▲索引从1开始

使用APItable

1
2
3
4
5
6
7
8
9
10
11
-- 数组插入
for i=1,10 do
table.insert( arr , 1, i)
-- 经sxh发现结果是逆序的,19->2,20->1 , 原因是每次都从头部插入,相当于LIFO , 此时感觉像是数组(带索引key)...并且table.insert( arr , 2, i)结果只有2-->20 ,此时像字典(只有键2)

-- 正序的顺出
table.insert( arr , i) -- 默认在尾部开始插入
-- 或者arr[i] = i
end
-- 获得数组长度
table.maxn(arr)

面向对象

没有class类关键字,但可以自己实现类的功能:

  • 复制表table
  • 函数闭包

复制表table

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
people = {}

-- 法一
function people.sayHi()
print('Hi')
end

-- 法二
people.sayHi = function ()
print('Hi')
end


-- 拷贝
function clone( tab )
local arr = {}
for k,v in pairs(tab) do
arr[k] = tab[v]
end
return arr
end

-- 相当于是构造方法
People.new = function (name)
local self = clone(People)
self.name = name
return self
end

-- 成员函数
People.sayHi = function(self) -- self是类示例变量
-- ..是字符串连接
print("People say hi:".. self. name)
end

-- 测试可以实现类的功能
--local p = clone(People)
--p.sayHi()

-- 测试构造函数
local p = People.new("ZhangSan")
-- 需要传类示例
p.sayHi(p)
-- 使用:可以不用传类示例
p:sayHi()


Man={}
-- 实现类的继承的功能
Man.new = function (name)
local self =People.new(name)
copy(self, Man)
return self
end

-- 增添成员函数
Man.sayHello=function()
print("Man say hello")
end

-- 重写成员函数
Man.sayHi = function (self)
print("Man sayHi".. self.name)
end

函数闭包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function People()
local self = {}
function init( name )
self.name = name
end

function sayHello()
print("Hello "..self.name)
end

init()
return self
end

-- 继承
function Man(name)
local self= People(name)
-- local function init()
-- end
self.sayHello=function ()
print("hello"..self.name)
end
return self
end

学习自 https://www.bilibili.com/video/av46428956/?p=8


通过表的特性实现switch关键字功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
local key = 1  
local switch = {
[1] = function()
print("switch:"..1)
end,
[2] = function()
print("switch:"..2)
end,
["test"] = function()
print("switch:test")
end,
}
switch[2]()
-- >>> 2

伪随机数的生成

1
2
3
4
5
6
-- 因此“短时间内多次运行程序” 这样的需求下 os.time 还真不大好。可是又没有比 time 函数更方便的种子生成器, 怎么办呢?
math.randomseed(tostring(os.time()):reverse():sub(1, 6))
for i=1, 5 do
print(math.random(4))
end
-- 就是把 time返回的数值字串倒过来(低位变高位), 再取高位6位。 这样, 即使 time变化很小, 但是因为低位变了高位, 种子数值变化却很大,就可以使伪随机序列生成的更好一些

Author: Mrli

Link: https://nymrli.top/2019/06/03/lua学习/

Copyright: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.

< PreviousPost
Oauth2原理、使用
NextPost >
Java课程第三次实验报告
CATALOG
  1. 1. lua学习
    1. 1.0.1. 表{} <==>字典
    2. 1.0.2. 数组{}
  2. 1.1. 面向对象
    1. 1.1.1. 复制表table
    2. 1.1.2. 函数闭包