【Lua学习笔记】Lua进阶——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

上述语句和三目运算符的作用是一样的

猜你喜欢

转载自blog.csdn.net/milu_ELK/article/details/131964260