Lua把chunk(Lua把加载的一份外部代码也看作一个chunk)当作匿名函数处理,例如”a=1”.loadstring返回与其等价的function() a = 1 end。 loadfile只是在编译chunk成为自己内部实现的一个匿名函数。
dofile会编译并执行,loadfile只编译代码生成中间码并且返回编译后的chunk作为一个函数,但不执行代码。 如果要运行一个文件多次,loadfile只需要编译一次,但可以运行多次,dofile每次都需要编译。
require形式上很类似C++ 语言的#include<>,在其他地方定义的函数,经这么引入之后就可以调用了,不过Lua不是定义和实现分离的语言,这样是把整个定义部分都加载进来了,加载过程大致上是:Lua先加载这个外部文件,然后运行它。实际上这段外部代码是有返回值的,它的返回值,就是require的返回值。
以加载luafila.lua为例 luafile.lua
print("hello") sayHi = function() print("Hi") endrequire的返回值就是外部代码的返回值。如果外部代码没有返回值,require默认加载成功后返回ture
luafile1.lua
t = {} t.value = 100; t.sayHi = function() print("Hi") end t.table = { introduce = "I am a table"} //没有return语句 t1 = require "luafile1" print(t.value) -- result : 100 print(t1) -- result : true 没有return语句且加载成功require返回trueluafile2.lua
t = {} t.value = 100; t.sayHi = function() print("Hi") end t.table = { introduce = "I am a table"} //新增return语句返回一个函数 return t.sayHi t1 = require "luafile2" print(t.value) -- result : 100 print(t1) -- result : function: 00BABCE8 返回外部代码return的函数 t1() -- result : Hiluafile3.lua
t = {} t.value = 100; t.sayHi = function() print("Hi") end t.table = { introduce = "I am a table"} return t t1 = require "luafile3" print(t) -- result : table: 00C696C8 print(t1) -- result : table: 00C696C8 for k,v in pairs(t) do -- result : value 100 print(k , v) -- sayHi function: 00C6B988 end -- table table: 00C696A0loadfile只编译代码生成中间码并且返回编译后的chunk作为一个函数,但不执行代码 luafil.lua
print("hello") sayHi = function() print("Hi") end -- 相当于将匿名函数 -- function() -- print("hello") -- sayHi = function() -- print("Hi") -- end -- end -- 引用赋值给f f = loadfile("loadfiletest.lua") f() print("end") -- result print: -- hello -- enddofile类似require,也是返回外部代码的返回值。区别是如果外部代码没有返回值,则返回nil,也就是说无返回值
在Lua中要声明全局变量非常简单,就是定义变量的时候,不要加上local,这个神秘的全局变量,其实本质上也是一个table,它把我们创建的全局变量都保存到一个table里了,而这个table名为_G. 我们在外部文件中定义的函数、表、字符串等值,实际上在加载时全部都被加到全局环境下。不过全局的东西用起来要小心,有一个原则是对全局的“污染”越小越好。那么自然就引入了“模块”的概念。在Lua中,模块是由万能的table充当的,最自然的想法就是定义一个table,然后把要定义的函数放在这个table中,最后返回这个table就行了。 比如对一个luafile.lua文件,加载它就为_G全局表新增了mood、sayHi、t字段 luafile.lua
t = { value = 100 } sayHi = function() print("Hi") end mood = "Happy" t1 = require "luafile" print(mood) -- Happy print(_G["mood"]) -- Happy print(sayHi) -- function: 00C2BD08 _G["sayHi"]() -- Hi print(_G["t"].value) -- 100以模块的方式加载
t = { value = 100 } t.sayHi = function() print("Hi") end t.mood = "Happy" return t_G表就只新增字段t,且我们可以通过该表获取所有字段值。
参考: www.cnblogs.com/yyxt/p/3870236.html www.jb51.net/article/55125.htm www.cnblogs.com/sifenkesi/p/3757282.html
