文章目录
- Require
- 短路判断实现三目运算符
Require
这是文件aaa.lua
的内容
aaa.lua:
a = 10
local b = 20
print("我是aaa")
这是文件example.lua
的内容
example.lua:
a = 100
print(a)
require("aaa") --require调用其他脚本文件
print(a)
print(b)
print("###我是分割线###")
print(package.loaded["aaa"]) -- true
package.loaded.aaa = nil --卸载脚本语句
print(package.loaded["aaa"]) --nil
输出:
100
我是aaa
10
nil
###我是分割线###
true
nil
可以看到,在使用require之后,会直接对其他文件进行调用执行。而且我们可以直接访问它的全局变量,并且发现我们的全局变量被覆盖了,而它的局部变量就像private一样,不能被这个文件访问。
从package.loaded
这个方法我们可以猜到了,package
是一个table
,里面存放了另一个table
叫做loaded
,这个loaded
里面会把require
的脚本以脚本名作为索引来存放,直接将其置为nil就相当于卸载脚本了。
为什么变量a从100变为了10?我认为不是调用了aaa.lua
的变量a,而是example.lua
的变量a被覆盖了。让我们验证一下:
这是文件aaa.lua
的内容
function a()
print("我是aaa")
end
print(a)
a()
这是文件example.lua
的内容
function a()
print("我是example")
end
print(a)
a()
require("aaa")
print(a)
a()
print(package.loaded["aaa"])
package.loaded.aaa = nil
print(a)
a()
输出:
function: 00C1C500
我是example
function: 00C1C660
我是aaa
function: 00C1C660
我是aaa
true
function: 00C1C660
我是aaa
从打印信息可以看出,首先我们定义的方法a()
被存放到了00C1C500
这个地址,而执行require
之后a()
的地址变为了00C1C660
,而整个地址正是aaa.lua
文件定义的方法a
的地址。即使卸载之后example.lua
文件的a
地址依旧是00C1C660
。这说明example.lua
中同名的变量确实被重定义了。虽然我没看过源码,我严重怀疑require("aaa")
就是顺序执行了除了带有local
关键字语句的aaa.lua
的文件。
通过打印_G
表我们发现local
变量确实没有被存入该文件的全局变量。并且即使本文件定义local
变量也不会被存进去,说明_G
表就是一个存放全局变量的表。
综上所述:
require("文件名")
可以执行require的文件,并且获取内部的全局变量,如果本地变量名重复,先赋值的会被覆盖。其他文件定义的local
变量不会被访问。package
是一个table
,里面存放了另一个table
叫做loaded
,这个loaded
里面会把require
的脚本以脚本名作为索引来存放,直接将其置为nil就相当于卸载脚本
短路判断实现三目运算符
Lua中是没有三目运算符的,但是我们可以用逻辑判断伪装一个三目运算符
让我引用一下我在【Lua学习笔记】Lua入门中写的
逻辑判断(Lua很特殊,这个比较重要)
Lua认为false和nil为假,true和非nil为真,所以0代表也是真。 唯一需要注意的是Lua中不等于为 ~= 与或非分别是and or not
接下来用T代表真,F代表假,?代表任意bool
print(F and ?)
在进行and运算的时候,如果第一个值就为false,那输出值一定为false,?是什么都不影响了,所以结果一定为false,输出F即可
print(T and ?)
在进行and运算的时候,如果第一个值为true,我们依然无法确定输出值,此时我们需要知道?是true还是false
但是最后的运算结果一定是由?决定的,如果?为true运算就是true,问号为false运算就是false,所以and左值为真时,输出的结果一定是右值
因此该语句会输出 ?
print(T or ?)
同理,or运算中如果左值为true,结果一定为true,因此输出T即可
print(F or ?)
or运算中如果左值为false,最后结果则是由?是true还是false决定,因此输出结果一定是右值
上述语句输出 ?
上述判断被称为短路判断,我们可以利用短路实现一个三目运算符
x,y=1,2
res = (x > y) and "yes" or "no"
print(res)
x,y=2,1
print(res)
输出:
no
yes
上述语句和三目运算符的作用是一样的