Lua入门 —— 一些常用的琐碎

Posted 宋萌萌萌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lua入门 —— 一些常用的琐碎相关的知识,希望对你有一定的参考价值。

在疫情还未得到有效遏制的日子里,大家尽量少出门,勤洗手,多喝水,并注意身心健康。这篇文章咱们只单纯的聊点技术。


就以Q&A的形式针对几个常见的问题做个解答吧


Q:怎样在一个文件中引用另外一个文件?

A:推荐通过require(path)方法执行一个文件的引用操作,path指文件相对于Lua工程目录src的相对路径,一般情况下习惯将路径中的/改成.,如需引用src/view/HomeView.lua, 则执行require("view.HomeView")


require()方法在实现上可以分为两步,第一步 loadfile ,第二步 dofile

loadfile会检查文件是否被加载过,然后决定是否调用加载器去加载文件。

dofile会把这个文件作为一个Chunk从上至下依次执行,如果在文件结尾有return语句,则通过该require语句会得到返回值。
实际开发过程中经常有如下写法:
-- 如文件:src/model/Person.lua实现如下-- 定义Person类local Person = {}function Person:new(o)    o = o or {}    setmetatable(o, self)    slf.__index = self    return oend
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这个步骤。



Q: 元表除了在new()有方法中的固定用法外还有何用?
A:元表也是个普通的表,它里存放着类相关的信息,其中最主要的是函数,存放形式是以函数名为key,函数体为value。如果你开心,也可以在元表里存一些所有类对象共享的数据,这样所有对象都可以通过 self.key 去访问。


以为函数名和函数体为table中的key-value存储,这就为一些操作提供了可行性,如:

  • 判断方法是否存在
  • 获取函数并执行
  • hook函数
  • 替换函数实现
  • 在不知道类的情况下通过元表构建一个新的对象(如果有必要的话)


至于还可以做哪些别的骚操作,你尽可以发挥自己的聪明才智~



Q: 如何获取一个对象obj的元表?
A: local mt = getmetatable(obj) getmetatable() 是获取一个对象元表的全局方法, mt即为obj的元表。
-- 以上面提到的对象p类为例
local mt = getmetatable(p)-- 判断方法是否存在,存在则调用if type(mt["work"]) == "function" then    mt["work"]() -- 此处调用相当于点调用,而不是冒号调用,因此不包含隐含参数selfend
-- 假设我们在不知道Person类的情况下,想创建p的同类型对象p1(默认所有类都有同样的构造方法new())if type(mt["new"]) == "function" then  local p1 = mt["new"](mt)  -- 以为new方法中用到了self,因此需要将方法调用者作为参数显式传递end


Q: 使用全局变量需要注意点什么?
A:在Lua中,没有用local关键字修饰的变量都是全局变量,一经创建“全局”存在。这里说的全局指的是当前的虚拟机中,实际MLN开发过程中一个页面往往只对应一个虚拟机。

Lua有个全局表_G,你所能直接访问到的tablestringtype()require()等等都保存在这个表里,在进行实际开发前,建议先打印一下这个表里都有些什么东西,免得对一些全局变量造成命名冲突而产生一些难以debug的异常。

for k,v in pairs(_G) do print(k,v)end

在Lua这种可以随意定义和修改全局变量的语言中,有N多年开发经验的你一定知道命名空间的重要性,滥用全局变量的代价是巨大的,所以一般情况下能不用全局变量就不用。




刚刚发现《Lua程序设计》的电子书:
https://www.bookstack.cn/books/LuaBook  
刚开始写MLN的时候,老大丢过来这本书的pdf,说看完第一章的前五节,差不多就可以开始写了,现在回想起来真有点不堪回首啊~

今天就到这里,后续就开始进入MLN实战了,如果有哪些想了解或者搞不明白的可以留言~

以上是关于Lua入门 —— 一些常用的琐碎的主要内容,如果未能解决你的问题,请参考以下文章

IOS开发-OC学习-常用功能代码片段整理

Lua特性和一些基础语法总结(Lua入门到精通一)

在Pandoc lua过滤器中连接字符串片段

swift常用代码片段

Lua高性能脚本语言快速入门

lua 如何最快速度入门