UH2S1L9——多Lua脚本执行

本章代码关键字

1
2
3
4
5
local                --声明局部变量
return --脚本返回值,外部加载该脚本时可以接收这里的返回值
require() --加载一个脚本,若加载脚本有返回值还可以返回出这个值
package.loaded[] --可以查看某个脚本是否被加载,将其赋值nil可以卸载某个脚本
_G --_G表是一个总表,我们申明的所有全局变量都存储在其中

全局变量和本地变量

全局变量

Lua默认声明出来的变量是全局变量,这是一种声明出来后就可以在脚本里到处调用的变量,
即使它是在循环体或者函数体内声明的变量,出了循环或者函数仍然可以使用,不会释放内存
显然到处使用全局变量是很浪费内存的

1
2
3
4
5
6
7
8
9
10
11
for i = 1, 2 do
c = "唐老狮"
end
print(c) --这个c在出了循环体后依然可以调用

function Fun()
tt = "123123123"
end
print(tt)
Fun()
print(tt)
1
2
3
唐老狮
nil
123123123 --可见,在执行了函数后,函数内赋值的全局变量在函数执行后也能调用出来了

本地变量

在变量声明前,加上local​,就是本地(局部)变量,这种变量在出了循环体或者函数体后就会被释放内存

即使在函数体或者函数外声明了本地变量,它依然会在接下来的多脚本执行里起作用,这样的本地变量,外部脚本不能调用它们(除非你将它return​出去)

1
2
3
4
5
6
7
8
9
10
11
12
for i = 1, 2 do
local d = "唐老狮"
print(d)
end
print(d)

function Fun()
local tt = "123123123"
end

Fun()
print(tt)
1
2
3
4
唐老狮
唐老狮
nil --可见,循环结束后。d对应的内存被释放了
nil --可见,即使执行了函数,函数内的局部变量在函数外也不会调用

多脚本执行

require​,参数为要加载的脚本名(需要脚本在同一目录下,或者传入路径),执行后会自动执行该脚本内的内容
加载外部脚本后,外部脚本的全局变量在本脚本内依然可以使用,而本地变量不行
如果重复加载一个脚本,该脚本在加载一次过后就不会再被执行,除非重复加载前卸载脚本

Lesson11_Test.lua

1
2
3
print("Test测试")
TestA = "123"
local testLocalA = "456"

Lesson11_require.lua

1
2
3
4
print("**********多脚本执行************")
require("Lesson11_Test")
print(TestA)
print(testLocalA)
1
2
3
4
**********多脚本执行************
Test测试
123
nil

若想要外部脚本使用本脚本的局部变量,可以直接return​该局部变量,脚本return​不能再执行任何脚本
require​函数加载执行脚本时,还会返回出加载脚本的返回值(即使是本地变量亦可返回),可以用一个变量接收它,

Lesson11_Test.lua

1
2
3
4
5
print("Test测试")
TestA = "123"
local testLocalA = "456"

return testLocalA

Lesson11_require.lua

1
2
local testLA = require("Lesson11_Test")
print(testLA)
1
2
Test测试
456

脚本卸载

已知重复加载一个脚本,该脚本在加载一次过后就不会再被执行,可以通过package.loaded["脚本名"]​来获取一个脚本是否被加载

1
2
require("Lesson11_Test")
print(package.loaded["Lesson11_Test"])
1
2
Test测试
true

卸载脚本只需要执行package.loaded["脚本名"] = nil​即可

1
2
3
4
5
print("**********脚本卸载************")
require("Lesson11_Test")
print(package.loaded["Lesson11_Test"])
package.loaded["Lesson11_Test"] = nil
require("Lesson11_Test")
1
2
3
4
**********脚本卸载************
Test测试
true
Test测试

_G表

_G​表是一个总表,他将我们申明的所有全局变量都存储在其中(局部变量则不会存储到_G​内)

1
2
3
4
5
6
print("**********大G表************")
a = 1
local b = 2
for key, value in pairs(_G) do
print(key, value)
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
**********大G表************
a 1 --可见,之前声明的全局变量都可以在_G表内找到
string table: 00579890
xpcall function: 005776E8
package table: 00577950
tostring function: 005773E8
print function: 00577008
os table: 00579AC0
unpack function: 005773A8
require function: 00578308
getfenv function: 005771C8
setmetatable function: 00577348
next function: 00577188
assert function: 00577128
tonumber function: 005776C8
io table: 00579908
rawequal function: 00577068
collectgarbage function: 005772C8
arg table: 00579A98
getmetatable function: 00577288
module function: 005781C8
rawset function: 005770E8
math table: 00579778
debug table: 00579B60
pcall function: 005772A8
table table: 00577978
newproxy function: 00570578
type function: 00577568
coroutine table: 005777E8
_G table: 00573F08
select function: 005771A8
gcinfo function: 005771E8
pairs function: 00570548
rawget function: 00577228
loadstring function: 00577208
ipairs function: 00573F30
_VERSION Lua 5.1
dofile function: 005772E8
setfenv function: 005770A8
load function: 005770C8
error function: 00576FE8
loadfile function: 00577308