Lua入门 —— 一些常用的琐碎
Posted 宋萌萌萌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lua入门 —— 一些常用的琐碎相关的知识,希望对你有一定的参考价值。
在疫情还未得到有效遏制的日子里,大家尽量少出门,勤洗手,多喝水,并注意身心健康。这篇文章咱们只单纯的聊点技术。
就以Q&A的形式针对几个常见的问题做个解答吧
Q:怎样在一个文件中引用另外一个文件?
A:推荐通过require(path)方法执行一个文件的引用操作,path指文件相对于Lua工程目录src的相对路径,一般情况下习惯将路径中的“/”改成“.”,如需引用src/view/HomeView.lua, 则执行require("view.HomeView")
loadfile会检查文件是否被加载过,然后决定是否调用加载器去加载文件。
-- 如文件:src/model/Person.lua实现如下
-- 定义Person类
local Person = {}
function Person:new(o)
o = o or {}
setmetatable(o, self)
slf.__index = self
return o
end
function Person:work()
print("People need work to keep alive")
end
-- return的结果作为require()函数的返回值
return Person
-- 有文件src/Test.lua,该文件需引用Person.lua文件并创建一个Person对象
local Person = require("model.Person")
local p = Person:new()
p:work()
require有个优点,在loadfile阶段,当一个文件被首次require后,会保留其返回值的副本,再次require该文件时直接返回这个副本,省去了loadfile这个步骤。
以为函数名和函数体为table中的key-value存储,这就为一些操作提供了可行性,如:
-
判断方法是否存在 -
获取函数并执行 -
hook函数 -
替换函数实现 -
在不知道类的情况下通过元表构建一个新的对象(如果有必要的话)
至于还可以做哪些别的骚操作,你尽可以发挥自己的聪明才智~
-- 以上面提到的对象p类为例
local mt = getmetatable(p)
-- 判断方法是否存在,存在则调用
if type(mt["work"]) == "function" then
mt["work"]() -- 此处调用相当于点调用,而不是冒号调用,因此不包含隐含参数self
end
-- 假设我们在不知道Person类的情况下,想创建p的同类型对象p1(默认所有类都有同样的构造方法new())
if type(mt["new"]) == "function" then
local p1 = mt["new"](mt) -- 以为new方法中用到了self,因此需要将方法调用者作为参数显式传递
end
Lua有个全局表_G,你所能直接访问到的table、string、type()、require()等等都保存在这个表里,在进行实际开发前,建议先打印一下这个表里都有些什么东西,免得对一些全局变量造成命名冲突而产生一些难以debug的异常。
for k,v in pairs(_G) do
print(k,v)
end
在Lua这种可以随意定义和修改全局变量的语言中,有N多年开发经验的你一定知道命名空间的重要性,滥用全局变量的代价是巨大的,所以一般情况下能不用全局变量就不用。
以上是关于Lua入门 —— 一些常用的琐碎的主要内容,如果未能解决你的问题,请参考以下文章